【BZOJ1101】Zap [莫比乌斯反演]
2017-04-02 17:16
351 查看
Zap
Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss]
Description
对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。
Input
第一行包含一个正整数n,表示一共有n组询问。接下来n行,每行表示一个询问,每行三个正整数,分别为a,b,d。
Output
输出一个正整数,表示满足条件的整数对数。
Sample Input
24 5 2
6 4 3
Sample Output
32
HINT
1<=n<= 50000, 1<=d<=a,b<=50000
Solution
我们运用莫比乌斯反演,然后推一下式子得到:
#include<iostream> #include<string> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> using namespace std; typedef long long s64; const int ONE = 50005; int T; int n,m,k; bool isp[ONE]; int prime[ONE],p_num; int miu[ONE],sum_miu[ONE]; s64 Ans; int get() { int res=1,Q=1; char c; while( (c=getchar())<48 || c>57) if(c=='-')Q=-1; if(Q) res=c-48; while((c=getchar())>=48 && c<=57) res=res*10+c-48; return res*Q; } void Getmiu(int MaxN) { miu[1] = 1; for(int i=2; i<=MaxN; i++) { if(!isp[i]) prime[++p_num] = i, miu[i] = -1; for(int j=1; j<=p_num, i*prime[j]<=MaxN; j++) { isp[i * prime[j]] = 1; if(i%prime[j] == 0) { miu[i * prime[j]] = 0; break; } miu[i * prime[j]] = -miu[i]; } miu[i] += miu[i-1]; } } void Solve() { n=get(); m=get(); k=get(); if(n > m) swap(n,m); int N = n/k, M = m/k; Ans = 0; for(int i=1,j=0; i<=N; i=j+1) { j = min(N/(N/i), M/(M/i)); Ans += (s64)(N/i) * (M/i) * (miu[j] - miu[i-1]); } printf("%lld\n",Ans); } int main() { Getmiu(ONE-1); T=get(); while(T--) Solve(); }View Code
相关文章推荐
- 【莫比乌斯反演】BZOJ1101 [POI2007]Zap
- bzoj 1101 [POI2007]Zap 莫比乌斯反演
- 【bzoj1101】[POI2007]Zap 莫比乌斯反演
- bzoj 1101 [POI2007]Zap - 莫比乌斯反演
- [莫比乌斯反演] BZOJ1101: [POI2007]Zap
- [bzoj] 1101 Zap || 莫比乌斯反演
- 【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap
- BZOJ1101 [POI2007]Zap 【莫比乌斯反演】
- BZOJ 1101: [POI2007]Zap [莫比乌斯反演]
- BZOJ1101 [POI2007]Zap 【莫比乌斯反演】
- 【莫比乌斯反演】BZOJ1101 [POI2007]zap
- bzoj1101[POI2007]Zap-莫比乌斯反演
- bzoj1101: [POI2007]Zap 莫比乌斯反演
- BZOJ 1101 [POI2007]Zap | 莫比乌斯反演
- BZOJ 1101: [POI2007]Zap 莫比乌斯反演
- [莫比乌斯反演] BZOJ 1101 [POI2007]Zap
- bzoj1101 [POI2007]Zap 莫比乌斯反演
- BZOJ 1101 [POI2007]Zap 莫比乌斯反演
- [BZOJ 1101][POI2007]Zap:莫比乌斯反演
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)