#88pts WA求条-NOIP2024最后一天
  • 板块P1593 因子和
  • 楼主lyx128
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/29 14:42
  • 上次更新2024/11/29 17:51:19
查看原帖
#88pts WA求条-NOIP2024最后一天
1013479
lyx128楼主2024/11/29 14:42
#include<stdio.h>
#include<cstring>
using namespace std;
#define ll long long
const int N=5e7;
const int mod=9901;
ll a,b;
bool isprime[N+5];
int prime[N+5],len;
ll ans=1;
struct Node{
	ll p;
	ll r;
}t[N+5];
int n;
void DoPrime(ll a){
	memset(isprime,1,sizeof(isprime));
	isprime[1]=0;
	isprime[0]=0;
	for(ll i=2;i*i<=a;i++)
		if(isprime[i]){
			prime[++len]=i;
			for(ll j=i+i;j*j<=a;j+=i)
				isprime[j]=0;
		}
	return ;
}
ll FastPow(ll a,ll b){
	ll ans=1;
	while(b){
		if(b&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return ans;
}
ll cal(ll p,ll r){
	ll up=(FastPow(p,r+1)+mod-1)%mod;
	ll down=FastPow(p-1,mod-2);
	//printf("%d^%d => up=%d down=%d => ans=%d\n",p,r,up,down,(up*down)%mod);
	return (up*down)%mod;
//	ll up=FastPow(p,r+1);
//	ll down=FastPow(p-1,mod-2);
//	return ((up*down)%mod-down+mod)%mod;
}
int main(){
	scanf("%lld %lld",&a,&b);
	DoPrime(a);
	int i=1;
	while(a!=1&&i<=len){
		if(a%prime[i]==0){
			t[++n].p=prime[i];
			while(a%prime[i]==0){
				t[n].r++;
				a/=prime[i];
			}
		}
		i++;
	}
	if(a!=1){
		t[++n].p=a;
		t[n].r=1;
	}
	for(int i=1;i<=n;i++){
		//printf("%d^%d\n",t[i].p,t[i].r);
		ans=(ans*cal(t[i].p,t[i].r*b))%mod;
	}
	printf("%lld",ans);
	return 0;
}
2024/11/29 14:42
加载中...