HDU 5942 Just a Math Problem(莫比乌斯)

来源:互联网 发布:小黄鸭淘宝客筛选软件 编辑:程序博客网 时间:2024/06/05 16:09

题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=21108511




卡常啊。。。cal函数只能这么写啊。。。


代码:

#include<bits/stdc++.h>using namespace std;const int MAXN=1000000+5;const int MOD=1e9+7;typedef long long ll;bool check[MAXN+10]; int prime[MAXN+10]; int mu[MAXN+10]; void Moblus(){memset(check,false,sizeof(check));mu[1]=1;int tot=0;for(int i=2;i<=MAXN;i++){if(!check[i]){prime[tot++]=i;mu[i]=-1;}for(int j=0;j<tot;j++){if(i*prime[j]>MAXN) break;check[i*prime[j]]=true;if(i%prime[j]==0){mu[i*prime[j]]=0;break;}else{mu[i*prime[j]]=-mu[i];}}}}inline ll cal(ll n){ll ret=0;ll l,r;for(l=1;l*l<=n;l++)  ret+=n/l;for(ll t=n/l;l<=n;l=r+1,t--)r=n/t,ret+=(r-l+1)*t%MOD;return ret%MOD;}inline ll solve(ll n){ll ret=0;for(int i=1;(ll)i*i<=n;i++){if(mu[i]){ret+=mu[i]==1?cal(n/i/i):MOD-cal(n/i/i);if(ret>=MOD)ret-=MOD;}}return (ret+MOD)%MOD;}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);Moblus();int T;scanf("%d",&T);for(int _=1;_<=T;_++){ll n;scanf("%lld",&n);printf("Case #%d: %lld\n",_,solve(n));}return 0;}