BZOJ 4176: Lucas的数论 莫比乌斯反演 杜教筛

来源:互联网 发布:淘宝福袋真的不能退吗 编辑:程序博客网 时间:2024/06/04 20:06

4176: Lucas的数论

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 378  Solved: 242
[Submit][Status][Discuss]

Description

去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了。

在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数。他现在长大了,题目也变难了。
求如下表达式的值:
 
其中 表示ij的约数个数。
他发现答案有点大,只需要输出模1000000007的值。

Input

第一行一个整数n。

Output

 一行一个整数ans,表示答案模1000000007的值。

Sample Input

2

Sample Output

8

HINT

 对于100%的数据n <= 10^9。


化式子和下面的链接基本一样

BZOJ 3994: [SDOI2015]约数个数和 莫比乌斯反演

杜教筛搞前缀和就好了


ans会<0 竟然调了一中午 太傻了

#include<cmath>#include<ctime>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;typedef long long ll;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return f*x;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=1000100,mod=1000000007;int prime[N],mobius[N],M[N];bool book[N];void initial(){register int i,j,cnt=0;mobius[1]=1;for(i=2;i<N;++i){if(!book[i]){prime[++cnt]=i;mobius[i]=-1;}for(j=1;j<=cnt&&prime[j]*i<N;++j){mobius[i*prime[j]]=-mobius[i];book[i*prime[j]]=1;if(i%prime[j]==0){mobius[i*prime[j]]=0;break;}}}for(i=1;i<N;++i)M[i]=M[i-1]+mobius[i];}inline int getf(int x){int res=0;for(int i=1,pos;i<=x;i=pos+1){pos=x/(x/i);res+=1ll*(pos-i+1)*(x/i)%mod;res%=mod;if(pos==x)return 1ll*res*res%mod;}return 1ll*res*res%mod;}map<int,int>mp;int getsum(int x){if(x<N)return M[x];if(mp[x])return mp[x];int res=1;for(int i=2,pos;i<=x;i=pos+1){pos=x/(x/i);res-=1ll*(pos-i+1)*getsum(x/i)%mod;res%=mod;}if(res<0)res+=mod;mp[x]=res;return res;}int main(){initial();int n=read();register int i,pos,ans=0;for(i=1;i<=n;i=pos+1){pos=n/(n/i);ans+=1ll*(1ll*getsum(pos)-getsum(i-1))%mod*getf(n/i)%mod;ans%=mod;if(pos==n)break;}if(ans<0)ans+=mod;cout<<ans<<endl;return 0;}

阅读全文
0 0