Twjx @ 2020-08-25 11:34:16
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int a=1,b=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while('0'<=ch&&ch<='9') b=b*10+ch-'0',ch=getchar();
return b;
}
const int p=9901;
int s[65],cnt,ss[65],ct,ans=1;
int qpow(int a,int b){
int anss=1;
while(b){
if(b&1) anss=anss*a%p;
a=a*a%p;
b>>=1;
}
return anss%p;
}
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;y=0;return a;
}
int r=exgcd(b,a%b,x,y);
int tem=x;
x=y;
y=tem-a/b*y;
return r;//
}
int niyuan_tongyu(int a){
int x,y;
int d=exgcd(a,p,x,y);
//if(d!=1) return -1;//无解
return (x%p+p)%p;
}
int calc(int a,int b){
if(a%p==1) return b+1;
else {
//printf("%lld\n",pow(a,b+1)-1);
return ((qpow(a,b+1)-1)%p*niyuan_tongyu(a-1)%p)%p;
}
}
signed main()
{
int a,b,k=1;
a=read();b=read();
//if(a==0) {cout<<0<<endl;return 0;}//特判
//if(b==0||a==1) {cout<<1<<endl;return 0;}
for(int i=2;i<=a-1;i++){
if(a/i==a*1.0/i) {s[++cnt]=i,ss[cnt]=1;
k=a/i;
while(k){
if(k/i==k*1.0/i) ss[cnt]++,k/=i;
else break;}
a=k;
}
}
if(a!=1) {s[++cnt]=a;ss[cnt]=1;}
//printf("%lld %lld\n",s[i],ss[i]);
for(int i=1;i<=cnt;i++){
ss[i]*=b;
}
for(int i=1;i<=cnt;i++){
ans=(ans%p*calc(s[i],ss[i])%p)%p;
}
printf("%lld",ans%p);
return 0;
}
by Mars_Dingdang @ 2020-08-25 11:56:15
写清宾语(求助啥
by Twjx @ 2020-08-25 16:55:49
第14个点过不了,麻烦各位dalao看一下哪里有漏洞
by 一珂松果 @ 2020-10-25 11:11:53
我一开始第14个点也过不了,输出ans的时候加上(ans%p+p)%p就过了,你可以试一下
by Twjx @ 2020-11-07 08:59:38
@一珂松果 感谢,已解决
by hy1089knigh @ 2021-02-04 09:56:18
@一珂松果 为什么这样做就对了?直接输出ans不行?
by lwhqwer012 @ 2021-11-23 17:01:04
@hy1089knigh 因为 对p的n次方模完减去1之后 这个数有可能是负数 所以如果前面的p^n-1没有进行负数的取模的话 最后就需要(ans%mod+mod)%mod 可是试试这组输入 9901 2
by hy1089knigh @ 2021-11-25 22:52:09
@lwhqwer012 明白了,这样做就能让结果在mod以内且是正数
by florence25 @ 2023-04-14 18:18:26
@lwhqwer012 感谢
by Zq5437 @ 2023-08-16 20:52:23
@lwhqwer012 Or2,感谢