[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
相關文章
- GCD Inside: GCD 宏GCIDE
- 奇怪的GCDGC
- iOS GCD入門和GCD對CPU多核的使用iOSGC
- GCD Inside: GCD 資料結構GCIDE資料結構
- GCD 中Group的使用GC
- GCD SUMGC
- GCD CountingGC
- GCD QueriesGC
- gcd思維_cfECR107_B. GCD LengthGC
- 分數的GCD和LCMGC
- gcd與exgcdGC
- GCD裡的全域性佇列GC佇列
- GCD 死鎖原因GC
- GCD 原理詳解GC
- iOS GCD詳解iOSGC
- G. GCD on a gridGC
- [bzoj2818]gcdGC
- P2568 GCDGC
- iOS 中的 GCD 實現詳解iOSGC
- GCD與NSOperation之間的區別GC
- 多執行緒——GCD執行緒GC
- GCD 學習總結GC
- 又見GCD hd 2504GC
- GCD(三) dispatch_groupGC
- GCD(四) dispatch_semaphoreGC
- GCD原始碼原理分析GC原始碼
- GCD之佇列的實現和使用GC佇列
- Codeforces1493D GCD of an Array3DGC
- iOS-簡單易用的GCD計時器iOSGC
- 除法與GCD演算法的相關分析GC演算法
- iOS GCD執行緒之間的通訊iOSGC執行緒
- iOS 多執行緒之GCDiOS執行緒GC
- 關於GCD多工處理GC
- iOS多執行緒GCD篇iOS執行緒GC
- Swift GCD 瞭解一下SwiftGC
- GCD計時器替換NSTimerGC
- IOS多執行緒之(GCD)iOS執行緒GC
- 深入理解GCD之dispatch_queueGC