您的位置:首页 > 其它

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

2017-07-13 22:42 218 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: