BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
来源:互联网 发布:女朋友漂亮知乎 编辑:程序博客网 时间:2024/05/16 15:54
思路:
数据范围1e7,预处理出miu的前缀和,对于每个素数,反演式求
拓展:
如果是多组样例,那么预处理
#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8typedef long long int lli;using namespace std;const int maxn = 1e7+10;bool isprime[maxn];int prime[maxn];char miu[maxn];void moblus(){ int cnt = 0;miu[1] = 1; for(lli i = 2;i < maxn;i++){ if(!isprime[i]){ prime[cnt++] = i,miu[i] = -1;//phi[i] = i-1; } for(lli j = 0;j < cnt && i*prime[j] < maxn;j++){ lli x = prime[j]; isprime[i*x] = 1; if(i%x){ miu[i*x] = -miu[i]; //phi[i*x] = phi[i] * phi[x]; } else{ miu[i*x] = 0; //phi[i*x] = phi[i] * x; break; } } }}int ff[maxn],sum[maxn];int main(){ moblus(); for(int i = 1;i <= maxn;i++){ sum[i] = sum[i-1] + miu[i]; } lli a,ans = 0; scanf("%lld",&a); for(int i = 2;i <= a;i++){ if(isprime[i]==0){ lli b = a/i,l; for(int j=1;j<=b;j=l+1){//分块加速 l= b/(b/j); ans += (lli)(sum[l]-sum[j-1])*(b/j)*(b/j); } } } printf("%lld\n",ans); return 0;}
spoj 4491
#include<stdio.h>#include <iostream>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8typedef long long int lli;using namespace std;const int maxn = 1e7+10;bool isprime[maxn];int prime[maxn];char miu[maxn];void moblus(){ int cnt = 0;miu[1] = 1; for(lli i = 2;i < maxn;i++){ if(!isprime[i]){ prime[cnt++] = i,miu[i] = -1;//phi[i] = i-1; } for(lli j = 0;j < cnt && i*prime[j] < maxn;j++){ lli x = prime[j]; isprime[i*x] = 1; if(i%x){ miu[i*x] = -miu[i]; //phi[i*x] = phi[i] * phi[x]; } else{ miu[i*x] = 0; //phi[i*x] = phi[i] * x; break; } } }}int ff[maxn],sum[maxn];int main(){ lli p,q; scanf("%lld",&q); moblus(); for(int i = 2;i <= maxn;i++){ if(isprime[i]) continue; for(lli j = 1;j*i <= maxn;j++){ ff[j*i] += miu[j]; } } for(int i = 1;i <= maxn;i++){ sum[i] = sum[i-1] + ff[i];//注意,这里成了F系数的前缀和了 } while(q--){ lli a,b; scanf("%lld%lld",&a,&b); if(a>b) swap(a,b); lli ans = 0,l; for(int j=1;j<=a;j=l+1){//分块加速 l= min(a/(a/j),b/(b/j)); ans += (lli)(sum[l]-sum[j-1])*(a/j)*(b/j); } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
- BZOJ 2818 gcd(莫比乌斯反演)
- BZOJ 2818 Gcd (欧拉筛 \ 莫比乌斯反演)
- bzoj 2818 Gcd(莫比乌斯反演)
- BZOJ 2818-Gcd(莫比乌斯反演)
- Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)
- SPOJ 4491 Primes in GCD Table(莫比乌斯反演)
- SPOJ 4491 PGCD - Primes in GCD Table(莫比乌斯反演)
- SPOJ PGCD - Primes in GCD Table (好题! 莫比乌斯反演+分块求和优化)
- bzoj 2818 Gcd 莫比乌斯反演
- BZOJ 2818: Gcd (莫比乌斯反演)
- Bzoj 2818: Gcd(莫比乌斯反演)
- [BZOJ 2818]Gcd:莫比乌斯反演
- spoj Primes in GCD Table 莫比乌斯反演
- SPOJ 7001 Visible Lattice Points (莫比乌斯反演+分块)
- bzoj 2301 -莫比乌斯函数反演+分块优化
- spoj 4491 莫比乌斯反演
- HDOJ 1695 GCD(容斥+欧拉函数&&莫比乌斯反演+分块)
- 问题 E: QAQ & 君临天下 || 天行九歌||多校联萌(三)
- 聚类分析经典算法讲解及实现
- 线性求区间欧拉函数(顺便线性求区间内所有素数)(类似欧拉线性素数筛)
- 微调-模型
- ACM暑假集训日记 17.8.11
- BZOJ 2818 Gcd + spoj 4491(莫比乌斯反演 分块)
- POJ 3046 -- Ant Counting (动态规划)
- 一些java程序的运行结果
- .Net基础视频教程之6-函数
- 【暴力预处理+剪枝/bitset】Golf Bot UVALive
- fabric源码解析12——peer的MSP服务
- HPU 1410 QAQ & 火星情报局 (数学)
- Lesson02_C#基础_part02
- NSURLSession加载网络HTML数据