洛谷【P2257】YY的GCD
生活随笔
收集整理的這篇文章主要介紹了
洛谷【P2257】YY的GCD
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)為質數的(x, y)有多少對
做的第一道莫比烏斯反演的題目有點...難啊,還沒學會 待更
F(n)表示的是gcd(i,j)=n或為n的倍數的個數,那么我們再求解F(n)時顯然是要枚舉它的倍數
所以就是n|d,即枚舉d為n的倍數
// 要設 F(n)= gcd(x,y)=n或者是n的倍數,個數為多少,
看:https://www.cnblogs.com/peng-ym/p/8652288.html
?
#include<bits/stdc++.h> #define N 10000100 typedef long long ll; const int maxn=10000000; using namespace std; ll g[maxn]; ll sum[maxn]; bool check[maxn]; ll mu[maxn]; ll prim[maxn]; int cnt=0; using namespace std; inline void read(int &x) {x=0;static int p;p=1;static char c;c=getchar();while(!isdigit(c)){if(c=='-')p=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();}x*=p; } inline void print(long long x) {static int cnt;static int a[15];cnt=0;do{a[++cnt]=x%10;x/=10;}while(x);for(int i=cnt;i>=1;i--)putchar(a[i]+'0');puts(""); } bool vis[N]; void get_mu(int n) {mu[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){mu[i]=-1;prim[++cnt]=i;}for(int j=1;j<=cnt&&prim[j]*i<=n;j++){vis[i*prim[j]]=1;if(i%prim[j]==0)break;else mu[prim[j]*i]=-mu[i];}}for(int j=1;j<=cnt;j++)for(int i=1;i*prim[j]<=n;i++)g[i*prim[j]]+=mu[i];for(int i=1;i<=n;i++)sum[i]=sum[i-1]+(long long)g[i]; } int n,m; int main() {int t;read(t);get_mu(10000000);while(t--){read(n);read(m);if(n>m)swap(n,m);static long long ans;ans=0;for(int l=1,r;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));ans+=1ll*(n/l)*(m/l)*(sum[r]-sum[l-1]);}cout<<ans<<endl;}return 0; }?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的洛谷【P2257】YY的GCD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj1061-青蛙的约会
- 下一篇: FZU - 2020 计算大组合数取模