【NOIP2017模拟9.2A组】春思
程序员文章站
2023-12-24 22:17:27
...
Description
Input
Output
Sample Input
2 3
Sample Output
15
这题有一个很高级的公式,就是计算因子和的公式。
要快速计算x的因子个数和因子和,首先将x分解质因数。
那么我们考虑怎么算后面的;
①如果n是偶数,
我们把前面抽出来
②如果n是奇数,
我们把前面抽出来
这样我们先给a分解质因数,然后每个的个数都乘上b,就可以套用这个公式去算啦。
#include<cstdio>
#include<iostream>
using namespace std;
long long num[1001][3];
long long a,b,ans,aa;
long long ksm(long long a,long long b)
{
long long t=1,y=a%9901;
while (b)
{
if (b&1==1) t=t*y%9901;
(y*=y)%=9901;
b=b>>1;
}
return t;
}
long long find(long long x,long long y)
{
if (y==1) return x;
if (y%2==0) return (find(x,y/2)%9901)*(1+ksm(x,y/2));
if (y%2==1) return ((find(x,(y-1)/2)%9901)*(1+ksm(x,(y-1)/2))%9901)+ksm(x,y);
}
int main()
{
scanf("%lld%lld",&a,&b);
long long i,j;
j=2;aa=a;
if (b==0)
{
a=1;
b=1;
}
ans=1;
for (j=2;j*j<=aa;++j)
{
if (a%j==0)
{
++num[0][0];
while (a%j==0)
{
num[num[0][0]][1]=j;
++num[num[0][0]][2];
a/=j;
}
num[num[0][0]][2]*=b;
ans=(ans*(find(num[num[0][0]][1],num[num[0][0]][2])+1))%9901;
}
}
if (a>1)
{
num[num[0][0]][1]=a;
num[num[0][0]][2]=b;
ans=(ans*(find(num[num[0][0]][1],num[num[0][0]][2])+1))%9901;
}
printf("%lld\n",ans);
}