一本通OJ-约数之和

约数之和

题意

ABmodP意义下的约数之和。

分析

先来看一个简单的问题,对于一个数n,若n=p1m1p2m2...pnmn。对于pi在和中贡献j=0mipij。则约数和为i=1n(j=0mipij)。易对于AB来说Ans=i=1n(j=0Bmipij)。我们考虑设

x=p10+p21...pm

px=p1+p2...pm+1

则得x=piBki+11pi1

Ans=i=1n(piBki+11pi1)

9901pi1时,相当于直接/9901。否则求pi1的逆元。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int tot;
const int N=1e5+67;
int p[N],k[N];
const int mod=9901;
int a,b;
void get(int n){
	int i=2;
	while(n!=1){
		if(n%i==0){
			p[++tot]=i;
			while(n%i==0) n/=i,k[tot]++;
		}
		i++;
	}
}
int qpow(int shu,int cifang,int mod){
	int ans=1;
	int k=cifang;
	while(k){
		if(k&1){
			ans=ans*shu%mod;
			shu=shu*shu%mod;
		}
		else{
			shu=shu*shu%mod;
		}
		k>>=1;
	}
	return ans%mod;
}
int ans=1;
signed main(){
	scanf("%lld%lld",&a,&b);
	get(a);
	for(int i=1;i<=tot;i++){
		if((p[i]-1)%mod==0) ans=ans*(b*k[i]+1)%mod;
		else{
			int j=(qpow(p[i],k[i]*b+(long long)1,mod)-1+mod)%mod;
			int inv=qpow(p[i]-1,mod-(long long)2,mod);
			ans=ans*j*inv%mod;

		}
	}
	printf("%lld",ans);
	return 0;
}
posted @   Zimo_666  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示