bzoj2820YY的GCD;BZOJ2693jzptab
来源:互联网 发布:已备案域名接入阿里云 编辑:程序博客网 时间:2024/06/16 19:49
前言
除了说都是数论,都是莫比乌斯反演。此外,他们都用到了换元的思想。
bzoj2820YY的GCD
题意
求有多少数对
初步方案
显然会TLE
优化
我们令
用分块的方法,我们可以用
在线性筛法中,我们可以求出后半部分
代码
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;long long miu[10000005];long long sum[10000005];bool vis[10000005];long long prime[10000005];void shai(){ long long cnt=0; miu[1]=1; for(long long i=2;i<=10000000;i++){ if(!vis[i]){ prime[++cnt]=i; miu[i]=-1; } for(long long j=1;j<=cnt&&i*prime[j]<=10000000;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ miu[i*prime[j]]=0; break; } else miu[i*prime[j]]=-miu[i]; } } for(long long i=1;i<=cnt;i++) for(long long j=prime[i];j<=10000000;j+=prime[i]) sum[j]+=miu[j/prime[i]]; for(long long i=1;i<=10000000;i++) sum[i]+=sum[i-1];}long long f(long long n,long long m){ if(n>m) swap(n,m); long long ans=0,last; for(long long i=1;i<=n;i=last+1){ last=min(n/(n/i),m/(m/i)); ans+=(sum[last]-sum[i-1])*(n/i)*(m/i); } return ans;}int main(){ shai(); long long t; scanf("%lld",&t); while(t--){ long long n,m; scanf("%lld%lld",&n,&m); printf("%lld\n",f(n,m)); }}
BZOJ2693jzptab
题意
加强版BZOJ2154。
求
初步方案
令
则
令
令
由于
所以,由莫比乌斯反演,有
则
分块优化。时间复杂度O(n)
代码1(TLE)
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;long long mobiwuzi[10000005];long long sum[10000005];bool vis[10000005];long long prime[10000005];long long mod=20101009;inline long long SUM(long long x,long long y){ return (x*(x+1)/2)%mod*((y*(y+1)/2)%mod)%mod;}void shai(long long t){ long long cnt=0; mobiwuzi[1]=1; for(long long i=2;i<=t;i++){ if(!vis[i]){ prime[++cnt]=i; mobiwuzi[i]=-1; } for(long long j=1;j<=cnt&&i*prime[j]<=t;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ mobiwuzi[i*prime[j]]=0;break; } else mobiwuzi[i*prime[j]]=-mobiwuzi[i]; } } for(long long i=1;i<=t;i++){ sum[i]=(sum[i-1]+mobiwuzi[i]*i*i)%mod; }}long long f(long long x,long long y){ if(x>y) swap(x,y); long long ans=0,last; for(long long i=1;i<=x;){ last=min(x/(x/i),y/(y/i)); ans=(ans+(((sum[last]-sum[i-1])%mod)*SUM(x/i,y/i))%mod+mod)%mod; i=last+1; } return ans;}void solve(long long n,long long m){ if(n>m) swap(n,m); long long ans=0,last; for(long long i=1;i<=n;){ last=min(n/(n/i),m/(m/i)); ans=(ans+((((i+last)*(last-i+1)/2)%mod)*(f(n/i,m/i)%mod))%mod+mod)%mod; i=last+1; } //while(ans<0) ans+=mod; printf("%lld\n",ans);}int main(){ //while(1){ long long n,m; scanf("%lld%lld",&n,&m); shai(max(n,m)); solve(n,m); //}}
优化
由上,可有
令
有
用分块的方法,我们可以用
在线性筛法中,我们可以求出后半部分
没错,又是这句话
代码2(AC)
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;long long h[10000005];long long sum[10000005];bool vis[10000005];long long prime[10000005];long long mod=100000009;long long SUM(long long x,long long y){ return ((x*(x+1)/2)%mod*((y*(y+1)/2)%mod))%mod;}void shai(long long t){ long long cnt=0; h[1]=1; for(long long i=2;i<=t;i++){ if(!vis[i]){ prime[++cnt]=i; h[i]=(i-i*i%mod+mod)%mod; } for(long long j=1;j<=cnt&&i*prime[j]<=t;j++){ vis[i*prime[j]]=1; if(i%prime[j]==0){ h[i*prime[j]]=prime[j]*h[i]%mod; break; } else h[i*prime[j]]=h[prime[j]]*h[i]%mod; } } for(long long i=1;i<=t;i++) sum[i]=sum[i-1]+h[i];}long long f(long long n,long long m){ if(n>m) swap(n,m); long long ans=0,last; for(long long i=1;i<=n;i=last+1){ last=min(n/(n/i),m/(m/i)); ans+=SUM(n/i,m/i)*((sum[last]-sum[i-1])%mod)%mod; ans=(ans+mod)%mod; } while(ans<0) ans+=mod; return ans;}int main(){ int t; scanf("%d",&t); shai(10000000); while(t--){ long long n,m; scanf("%lld%lld",&n,&m); printf("%lld\n",f(n,m)); }}
总结
一堆函数乱搞
莫比乌斯反演
线性筛法预处
分块优化处理
阅读全文
0 0
- bzoj2820YY的GCD;BZOJ2693jzptab
- 数论莫比乌斯——bzoj2820YY的GCD
- 【莫比乌斯反演】BZOJ2154Crash的数字表格&BZOJ2693jzptab
- bzoj2693jzptab莫比乌斯反演
- GCD深入学习之GCD的初识
- 高端GCD 关于GCD的拓展
- gcd的递归表现形式
- [bzoj2820] yy的gcd
- 简单的gcd函数
- GCD的应用
- 扩展GCD的运用
- 多线程GCD的使用
- GCD的使用.
- 转过来的 gcd
- GCD的使用
- 多线程GCD的使用
- 多线程GCD的使用
- GCD的异步处理
- 设计模式--建设者模式
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
- XML的使用(Java)
- Find database OR Pull database
- UVA 1598 Exchange
- bzoj2820YY的GCD;BZOJ2693jzptab
- cf 828C
- centos 修改时间
- 基本数据类型
- LSTM单元
- (转)android中src和background区别
- android studio清单文件权限添加
- Java中的transient关键字
- 插件安装方法 eclipse、myeclipse