Title Link: http://poj.org/problem?id=1845
For quality factor decomposition , see the Template: http://www.cnblogs.com/atmacmer/p/5285810.html
Dichotomy idea: Select a target to compare, and keep two points between the interval [l,r] until the value equal to the target is taken.
#include <iostream>#include<cstdio>#include<cstring>using namespaceStd;typedefLong Longll;Const intn=10000;Const intMod=9901; ll Mult_mod (ll A,ll b) {a%=mod;b%=MOD; ll Res=0; while(b) {if(b&1) {res+=A; Res%=MOD; } A<<=1; if(A>=mod) a%=MOD; b>>=1; } returnRes;} ll Pow_mod (ll x,ll N) {if(n==1)returnX%MOD; X%=MOD; ll T=x,res=1; while(n) {if(n&1) res=Mult_mod (res,t); T=Mult_mod (t,t); N>>=1; } returnRes;}intprime[n+5];inttot;intvis[n+5];voidIsPrime () {tot=0; memset (Vis,0,sizeof(VIS)); memset (Prime,0,sizeof(prime)); for(intI=2; i<=n;i++) { if(!Vis[i]) {Prime[tot++]=i; for(intj=i*i;j<n;j+=i) vis[j]=1; }}}ll factor[ -][2];intCNT;//Decomposition factorizationvoidGetfactor (ll x) {cnt=0; ll T=x; for(intI=0;p rime[i]<=t/prime[i];i++) {factor[cnt][1]=0; while(t%prime[i]==0) {factor[cnt][0]=Prime[i]; while(t%prime[i]==0) {factor[cnt][1]++; T/=Prime[i]; } CNT++; } } if(t!=1) {factor[cnt][0]=T; factor[cnt][1]=1; CNT++; }}ll sum (ll p,ll N) {if(p==0)return 0; if(n==0)return 1; if(n&1) return((1+pow_mod (p,n/2+1))%mod*sum (p,n/2)%mod)%MOD; Else return((1+pow_mod (p,n/2+1))%mod*sum (p,n/2-1) +pow_mod (p,n/2)%mod)%MOD;}intMain () {intb; IsPrime (); while(~SCANF ("%d%d",&a,&b) {getfactor (a); ll ans=1; for(intI=0; i<cnt;i++) {ans*= (SUM (factor[i][0],b*factor[i][1])%MOD); Ans%=MOD; } printf ("%i64d\n", ans); } return 0;}
POJ 1845 sumdiv# mass factor decomposition + dichotomy