[SPOJ]DIVCNTK - Counting Divisors[數論]
題目地址
- 題目大意:
給定,求下面式子的值(對取模)
其中是約數個數函式。
這個似乎可以用杜教篩之類的,但是比較麻煩,複雜度比較高,但如果用就比較容易了。
我們只用考慮對於質數時的取值:
然後直接套min_25的式子就好啦!
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll unsigned long long
using namespace std;
const int M=2e6+10;
ll cnt,ID,n,sq,K;
ll idx(ll a){return a<=sq?a:ID-(n/a)+1;}
ll A[M],prime[M],g[M];
ll S(ll a,ll b){
if(a<prime[b]) return 0;
ll ans=g[idx(a)]-(K+1ll)*(b-1ll);
for(ll i=b;i<=cnt&&prime[i]*prime[i]<=a;i++){
for(ll j=prime[i],k=K+1ll;j*prime[i]<=a;j*=prime[i],k+=K){
ans+=S(a/j,i+1)*k+(k+K);
}
}
return ans;
}
int T;
int main(){
for(scanf("%d",&T);T--;){
scanf("%llu%llu",&n,&K);
if(n==1){puts("1");continue;}
sq=(ll)sqrt(n);ID=cnt=0;
for(ll i=1;i<=n;i=A[ID]+1){
A[++ID]=n/(n/i);
g[ID]=(K+1ll)*(A[ID]-1ll);
}
for(ll i=2;i<=sq;i++)if(g[i]!=g[i-1]){
prime[++cnt]=i;
for(ll j=ID,down=i*i;A[j]>=down;j--){
g[j]-=g[idx(A[j]/i)]-(K+1ll)*(cnt-1ll);
}
}
printf("%llu\n",S(n,1)+1ll);
}
return 0;
}
相關文章
- 計數排序 - Counting Sort排序
- GCD CountingGC
- Lake Counting S
- [ARC182C] Sum of Number of Divisors of Product
- SPOJ COT3 - Combat on a treeBAT
- PAT Advanced 1004 Counting Leaves
- D-query SPOJ - DQUERY (主席樹)
- SPOJ GSS3 (動態dp)S3
- Codeforces 954H Path Counting
- CF1919E Counting Prefixes
- python ref counting based garbage collectionPython
- 數論——數論分塊
- iOS中的Reference Counting詳解iOS
- 數論
- SPOJ - OPTM Optimal Marks(進位制拆分+最小割)
- 樹鏈剖分模板+入門題 SPOJ - QTREEQT
- SPOJ 1811 Longest Common Substring(字尾自動機)
- 數論(1):素數
- 數學 之 數論
- 剖析網路測量:Counting and Measuring Network Traffic
- 模板 - 數論
- 數論板子
- bzoj2588: Spoj 10628. Count on a tree(主席樹+LCA)
- 數論——質數與約數
- 數學——數論/雜項
- 【數論】素數篩法
- 基礎數論
- 數論相關
- 數論,但是板子
- 數論小記
- 數學 in OI-數論-1
- HDH 1264 Counting Squares (線段樹+掃描線|暴力)
- 【進階】數論函式求和(理論)函式
- bzoj1803: Spoj1487 Query on a tree III(DFS序+主席樹)
- 【筆記】數論 2024.8.4筆記
- 數論筆記-整除筆記
- 「數論難題解答」
- 初等數論——同餘