BZOJ 3512: DZY Loves Math IV [杜教筛]

BZOJ 3512: DZY Loves Math IV [杜教筛]

注意是去除所有质因子的乘积的n

厉害的思想是构造互质情况把phi(i*j)分开

补充candy?的最后一步推导:枚举e,那么gcd(i,n)要是e的倍数,枚举是e的多少倍(上界[m/e]),乘上phi(i*d),就是S(n,m)的形式了

#include
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=1e5+5;
const int M=1999880;
const int mod=1e9+7;
int pri[M],tot;
int pro[M];
int phi[M],vis[M];
int sum[M];
int n,m;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;
}
void sieve(int n){phi[1]=sum[1]=1;pro[1]=1;for(reg i=2;i<=n;++i){if(!vis[i]){pri[++tot]=i;phi[i]=i-1;pro[i]=i;}for(reg j=1;j<=tot;++j){if(i*pri[j]>n) break;vis[i*pri[j]]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];pro[i*pri[j]]=pro[i];break;}phi[i*pri[j]]=phi[i]*phi[pri[j]];pro[i*pri[j]]=pro[i]*pri[j];}sum[i]=ad(sum[i-1],phi[i]);}
}
const int G=31640;
int p1[G],p2[G];
int Phi(int n){if(n<=M-5){return sum[n];}//cout<<" 23333 ------"<if(n<G){if(p1[n]!=-1) return p1[n];}else{if(p2[m/n]!=-1) return p2[m/n];}int ret=(ll)n*(n+1)/2%mod;for(reg i=2,x=0;i<=n;i=x+1){x=(n/(n/i));ret=ad(ret,mod-1LL*(x-i+1)*Phi(n/i)%mod);}if(n<G){return p1[n]=ret;}else{return p2[m/n]=ret;}
}
map<int,int>mp[N];
int S(int n,int m){//cout<<" S "<if(m==0||n==0) return 0;if(n==1) return Phi(m);if(m==1) return phi[n];if(mp[n][m]) return mp[n][m];int ret=0;for(reg i=1;i*i<=n;++i){if(n%i==0){ret=ad(ret,(ll)phi[n/i]*S(i,m/i)%mod);if(i!=n/i) ret=ad(ret,(ll)phi[i]*S(n/i,m/(n/i))%mod);}}return mp[n][m]=ret;
}
int main(){rd(n);rd(m);if(n>m) swap(n,m);sieve(M-5);
//    cout<<" after sieve "<ll ans=0;memset(p1,-1,sizeof p1);memset(p2,-1,sizeof p2);for(reg i=1;i<=n;++i) {//    cout<<" ii "<ans=(ans+(ll)i/pro[i]*S(pro[i],m)%mod)%mod;}printf("%lld",ans);return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*Date: 2019/3/7 20:51:51
*/

 

转载于:https://www.cnblogs.com/Miracevin/p/10492891.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部