【BZOJ】【1101】【POI2007】Zap
莫比乌斯反演
PoPoQQQ的讲义例一的一半……好吧这题是那题的基础部分= =很水……
WA了一次:因为没强制类型转换LL
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /************************************************************** 2 Problem: 1101 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:6896 ms 7 Memory:1908 kb 8 ****************************************************************/ 9 10 //BZOJ 1101 11 #include<cstdio> 12 #include<cstdlib> 13 #include<cstring> 14 #include<iostream> 15 #include<algorithm> 16 #define rep(i,n) for(int i=0;i<n;++i) 17 #define F(i,j,n) for(int i=j;i<=n;++i) 18 #define D(i,j,n) for(int i=j;i>=n;--i) 19 using namespace std; 20 21 int getint(){ 22 int v=0,sign=1; char ch=getchar(); 23 while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();} 24 while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();} 25 return v*=sign; 26 } 27 /*******************tamplate********************/ 28 const int N=50010; 29 typedef long long LL; 30 int prime[N],mu[N],sum[N]; 31 bool check[N]; 32 void getmu(){ 33 mu[1]=1; 34 int tot=0; 35 for(int i=2;i<N;++i){ 36 if (!check[i]){ 37 prime[tot++]=i; 38 mu[i]=-1; 39 } 40 rep(j,tot){ 41 if (i*prime[j]>N) break; 42 check[i*prime[j]]=1; 43 if (i%prime[j]) 44 mu[i*prime[j]]=-mu[i]; 45 else{ 46 mu[i*prime[j]]=0; 47 break; 48 } 49 } 50 } 51 F(i,1,N-1) sum[i]=sum[i-1]+mu[i]; 52 } 53 LL calc(int m,int n,int k){ 54 int i,last; 55 LL re=0; 56 n/=k; m/=k; 57 for(i=1;i<=m && i<=n;i=last+1){ 58 last=min(n/(n/i),m/(m/i)); 59 re+=(LL)(sum[last]-sum[i-1])*(m/i)*(n/i); 60 } 61 return re; 62 } 63 int main(){ 64 int n=getint(),a,b,d; 65 getmu(); 66 F(i,1,n){ 67 a=getint(); b=getint(); d=getint(); 68 printf("%lld\n",calc(a,b,d)); 69 } 70 return 0; 71 }
1101: [POI2007]Zap
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1559 Solved: 534
[Submit][Status][Discuss]
Description
FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。
Input
第一行包含一个正整数n,表示一共有n组询问。(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个正整数,分别为a,b,d。(1<=d<=a,b<=50000)
Output
对于每组询问,输出到输出文件zap.out一个正整数,表示满足条件的整数对数。
Sample Input
2
4 5 2
6 4 3
4 5 2
6 4 3
Sample Output
3
2
2
HINT
对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(6,3),(3,3)。