您的位置:首页 > 其它

bzoj 4916 神犇和蒟蒻

2017-06-01 09:52 381 查看

//bzoj 4916 神犇与蒟蒻
#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 10000000
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
const int mxn=10000005;
const int mod=1e9+7;
using namespace std;
map <int,int> mp;
bool vis[mxn];
ll phi[mxn];
ll inv2,inv6;
int m,T,pri[mxn];
inline ll ksm(ll x,int k)
{
if(k==1) return x;
ll tmp=ksm(x,k>>1);
if(k&1) return tmp*tmp%mod*x%mod;
return tmp*tmp%mod;
}
inline void init()
{
int i,j;
puts("1");
phi[1]=1;
inv2=500000004;
inv6=166666668;
fo(i,2,N)
{
if(!vis[i]) pri[++pri[0]]=i,phi[i]=i-1;
for(j=1;j<=pri[0] && (ll)i*pri[j]<=N;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0)
{
phi[i*pri[j]]=phi[i]*pri[j]%mod;
break;
}
phi[i*pri[j]]=phi[i]*(pri[j]-1)%mod;
}
}
fo(i,1,N) phi[i]=phi[i]*i%mod;
fo(i,1,N) phi[i]=(phi[i]+phi[i-1])%mod;
}
inline ll S(ll x)
{
return (x*(x+1)%mod*inv2)%mod;
}
inline ll solve(ll n)
{
int i,j;
if(n<=N) return phi
;
if(mp.count(n)) return mp
;
ll now=n*(n+1)%mod*(n+n+1)%mod*inv6%mod,sum=0;
for(int i=2,last=0;i<=n;i=last+1)
{
last=n/(n/i);
sum=(sum+((S(last)-S(i-1)+mod))%mod*solve(n/i)%mod)%mod;
}
mp
=(now-sum+mod)%mod;
return (now-sum+mod)%mod;
}
int main()
{
int i,j;
ll x;
init();
scanf("%lld",&x);
printf("%lld\n",solve(x));
return 0;
}


4916: 神犇和蒟蒻

Time Limit: 10 Sec  Memory Limit:
512 MB
Submit: 82  Solved: 50

[Submit][Status][Discuss]

Description

很久很久以前,有一只神犇叫yzy;
很久很久之后,有一只蒟蒻叫lty;

Input

请你读入一个整数N;1<=N<=1E9,A、B模1E9+7;

Output

请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)};
请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)};



Sample Input

1

Sample Output

1

1

HINT

Source

By Monster_Yi

【分析】

杜教筛...第一次做...也不知道怎么回事

https://www.baidu.com/link?url=DrLxnCCPgy4onbGkvRUycEW8dKwWsR7J6Rclh8v1eMr9JwPg9zEZpBbIRYfQrn6c24_hNlYRJhErM3Ms7DEvZwjR1SS8GzP-lXWwVKgaLoK&wd=&eqid=9d6f2517000c3d1400000003592f703f

【代码】


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: