POJ-1845-Sumdiv(質因數分解+分治求等比數列和)
阿新 • • 發佈:2018-11-11
首先,對 b=1 的情況進行考慮:A 的約數,可以看成對其質因數分解(假設為m)後,從中取 n 個質因數(每個質因數取的個數不能超過A中有的)相乘。於是這道題我們也是一樣的做法。
的約數就是從A的m個質因數裡,取n個(其中,每個質因數取的個數,不超過 A中有的和B的乘積)
根據乘法分配律,可以得到:
1.對 A 質因數分解(試除法+篩法)
2.分治以某一個質因數p為公比,B*ci為項數求前 n 項和
3.注意配合快速冪
#include <cstdio> #include <cmath> #include <iostream> using namespace std; const int mod=9901; int m; int pp[500],cc[500]; void divide(int n) { m=0; for(int i=2;i<=sqrt(n);i++) { if(n%i==0) { pp[++m]=i; cc[m]=0; } while(n%i==0) { n/=i; cc[m]++; } } if(n>1) pp[++m]=n,cc[m]=1; } long long int qpow(long long int a,long long int b) { long long int r=1,base= a; while(b) { if(b&1) r=(r*base)%mod; base=(base*base)%mod; b>>=1; } return r; } long long int sum(long long int p,long long int c) { if(c==0) return 1; if(c==1) return p%mod+1; if(c&1) return ((1+qpow(p,(c+1)/2))*sum(p,(c-1)/2))%mod; else return ((1+qpow(p,c/2))*sum(p,c/2-1)+qpow(p,c))%mod; } int main() { int a,b; cin>>a>>b; if(a==1) { cout<<1<<endl; return 0; } divide(a); int res=1; for(int i=1;i<=m;i++) { res=(res * (sum(pp[i],cc[i]*b)%mod))%mod; } cout<<res<<endl; return 0; }