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;
}
卡常啊。。。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;
}
相关文章推荐
- [莫比乌斯反演] CCPC 2016 Hangzhou J & HDU 5942 Just a Math Problem
- HDU 5942 && 2016CCPC杭州 J: Just a Math Problem(莫比乌斯函数)
- hdu5942 Just a Math Problem
- [5055]Bob and math problem(hdu)
- HDU 1757 A Simple Math Problem 矩阵快速幂
- hdu 5974 A Simple Math Problem(欧几里得)
- HDU 1757-A Simple Math Problem(矩阵快速幂)
- hdu 1757 A Simple Math Problem (乘法矩阵)
- hdu 1757 A Simple Math Problem 矩阵
- HDU-5615(Jam's math problem)(方程求解)
- hdu 5615 Jam's math problem
- HDU 5170 GTY's math problem
- 【HDU】1757 - A Simple Math Problem(矩阵构造方法 & 快速幂)
- A Simple Math Problem(HDU 1757 构造矩阵)
- HDU - 5974 A Simple Math Problem(简单数论)
- HDU 5055 Bob and math problem(结构体)
- HDU 1757 A Simple Math Problem (矩阵快速幂)
- HDU-1757--A Simple Math Problem(矩阵乘法)
- hdu 5803 Zhu’s Math Problem (2016多校第六场1011)数位dp
- HDU 5055 Bob and math problem