powerful number
由于不会min25,只能来学powerful number了。
我们称:
考虑powerful number在
任意一个powerful number都可以表示成
现在要求
以下
p 都指质数。
构造两个简单的积性函数
且
那么根据
可以得出
那么
显然如果
现在考虑怎么构造
具体地:
显然不能直接令
小小的尝试:取
竟然成功了,小编也很好奇。
大家一定觉得很奇怪,为什么和其他题解求出的
关键就是
更正确的过程:
能力有限,推不下去了。这个
既然推不出
其实是可以只把所有的
复习一下杜教筛。
好难得
时间复杂度
破烂代码。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define debug(x) cout<<#x<<':'<<x<<endl
const ll mod = 1e9+7,inv2 = (mod+1)/2,inv6 = (mod+1)/6;
map<ll,ll> mp;
const int N = 1e7+20;
ll xphi[N];
int prime[N],tot,tot1,cnt;bool mark[N];
ll n;
pair<ll,ll> h[N];
ll ksm(ll a,ll b=mod-2)
{
ll ret = 1;
for(;b;b>>=1,a=a*a%mod)if(b&1)
ret =ret*a%mod;
return ret;
}
void init()
{
xphi[1] = 1;
for(int i=2;i<N;i++)
{
if(!mark[i])
{
prime[++tot] = i;
xphi[i] = i-1;
}
for(int j=1;j<=tot&&i*prime[j]<N;j++)
{
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
xphi[i*prime[j]]=xphi[i]*prime[j];
break;
}
xphi[i*prime[j]]=xphi[i]*xphi[prime[j]];
}
}
for(int i=1;i<N;i++)
xphi[i]=(xphi[i]*i+xphi[i-1])%mod;
}
void dfs(int k,ll val,ll x)
{
if(k>tot1 || x*prime[k] > n)
{
h[++cnt]={x,val};
return ;
}
dfs(k+1,val,x);
x*=prime[k];
for(int i=2;i<=n&&x*prime[k]<=n;i++)
{
x*=prime[k];
dfs(k+1,val*(ksm(prime[k],i+1)-ksm(prime[k],i))%mod*(i-1)%mod,x);
}
}
ll get(ll x)
{
x%=mod;
return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}
ll getsum(ll x)
{
if(x<N)return xphi[x];
if(mp.find(x)!=mp.end())return mp[x];
ll ret = get(x);
for(ll i=2,j;i<=x;i=j+1)
{
j=x/(x/i);
ret = (ret-(j-i+1)%mod*((i+j)%mod)%mod*inv2%mod*(getsum(x/i)%mod))%mod;
}
return mp[x]=ret;
}
int main()
{
scanf("%lld",&n);
init();
tot1=0;
while(1ll*prime[tot1+1]*prime[tot1+1]<=n)tot1++;
dfs(1,1,1);
ll ans = 0;
for(int i=1;i<=cnt;i++)
ans=(ans+1ll*h[i].second*getsum(n/h[i].first))%mod;
ans=(ans+mod)%mod;
cout << ans;
return 0;
}
/*
10000000000
*/