質因數分解
const int maxn=10000;
bool book[maxn+10];
int prim[maxn+10],pnum=0;
void getprim()
{
memset(book,0,sizeof(book));
pnum=0;
book[1]=book[0]=1;
for(int i=2;i<=maxn;++i)
{
if(!book[i])
{
prim[pnum++]=i;
}
for(int j=0;j<pnum && prim[j]<=maxn/i ;++j)
{
book[prim[j]*i]=1;
if(i % prim[j]==0) break;
}
}
}
ll fact[105][2];
int fnum=0;
int getfact(ll x)
{
fnum=0;
ll temp=x;
for(int i=0;prim[i]<=temp/prim[i];++i)
{
fact[fnum][1]=0;
if(temp%prim[i]==0)
{
fact[fnum][0]=prim[i];
while(temp % prim[i]==0)
{
fact[fnum][1]++;
temp /=prim[i];
}
fnum++;
}
}
if(temp!=1)
{
fact[fnum][0]=temp;
fact[fnum++][1]=1;
}
return fnum;
}
ll sum(ll p ,ll n,ll mod)
{
if(p==0) return 0;
if(n==0) return 1;
if(n&1) return ( ( 1+powermod(p,n/2+1,mod) )%mod * sum(p,n/2,mod)%mod )%mod;
else return ( (1+powermod(p,n/2+1,mod)) %mod *sum(p,n/2-1,mod)+powermod(p,n/2,mod)%mod)%mod;
}