[LOJ6491] zrq 的 gcd
【題目地址】
題意簡述
給定你求:
對取模,
這個題和CQOI2015選數很像,但是顯然要杜教篩,所以我們按照套路反演一波,列舉,原式轉化為:
將放入:
根據套路,我們列舉,令得到:
後面部分就是,所以原式變為:
所以杜教篩加快速冪即可,而模數十分特殊,所以直接用unsigned long long
,但是對於我們不再用逆元,而是直接判奇偶除過去。
上程式碼:
#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll unsigned long long
using namespace std;
const int M=1e7+1;
ll n,m;
ll fpow(ll a,ll b){
ll res=1llu;
for(;b;b>>=1,a*=a)if(b&1)res*=a;
return res;
}
ll prime[M],cnt,phi[M];
bool vis[M];
void init(){
phi[1]=1llu;
for(ll i=2;i<M;i++){
if(!vis[i]){
prime[++cnt]=i;
phi[i]=i-1llu;
}
for(ll j=1,v;j<=cnt&&i*prime[j]<M;j++){
v=i*prime[j];
vis[v]=1;
if(!(i%prime[j])){
phi[v]=phi[i]*prime[j];
break;
}
phi[v]=phi[i]*phi[prime[j]];
}
}
for(ll i=1;i<M;i++)phi[i]+=phi[i-1];
}
ll S(ll x){
if(x&1) return (x+1)/2*x;
else return x/2*(x+1);
}
map <ll,ll> mp;
ll calc(ll x){
if(x<M) return phi[x];
if(mp.count(x)) return mp[x];
ll ans=S(x);
for(ll i=2,j;i<=x;i=j+1){
j=(x/(x/i));
ans-=(j-i+1)*calc(x/i);
}
return mp[x]=ans;
}
ll solve(ll x,ll y){
ll ans=0;
for(ll i=1,j;i<=x;i=j+1){
j=(x/(x/i));
ans+=(calc(j)-calc(i-1))*fpow(x/i,y);
}
return ans;
}
int main(){
cin>>n>>m;
init();
cout<<solve(m,n)<<endl;
return 0;
}
End
相關文章
- 奇怪的GCDGC
- GCD Inside: GCD 宏GCIDE
- GCD的基本使用GC
- GCDGC
- iOS GCD入門和GCD對CPU多核的使用iOSGC
- GCD 中Group的使用GC
- GCD SUMGC
- GCD QueriesGC
- GCD Inside: GCD 資料結構GCIDE資料結構
- codechef Dynamic GCD [樹鏈剖分 gcd]GC
- 分數的GCD和LCMGC
- GCD常用的幾個方法GC
- Swift3中的 GCDSwiftGC
- 巧談 GCDGC
- 巧談GCDGC
- GCD那些事GC
- iOS GCD吹水iOSGC
- gcd與exgcdGC
- GCD CountingGC
- gcd思維_cfECR107_B. GCD LengthGC
- GCD裡的全域性佇列GC佇列
- GCD 原理詳解GC
- GCD 死鎖原因GC
- USACO GCD Extreme(II)GCREM
- 深入理解 GCDGC
- 【iOS】玩轉 - GCDiOSGC
- iOS GCD詳解iOSGC
- GCD簡單使用GC
- hdu 1695 GCDGC
- P2568 GCDGC
- iOS--GCD的API的理解與使用iOSGCAPI
- iOS 中的 GCD 實現詳解iOSGC
- 又見GCD hd 2504GC
- GCD原始碼原理分析GC原始碼
- GCD(三) dispatch_groupGC
- GCD(四) dispatch_semaphoreGC
- 多執行緒——GCD執行緒GC
- GCD 併發佇列GC佇列