//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[n];
if(mp.count(n)) return mp[n];
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[n]=(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;
}
//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[n];
if(mp.count(n)) return mp[n];
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[n]=(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 MBSubmit: 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
1
HINT
Source
【分析】
杜教筛...第一次做...也不知道怎么回事
【代码】