φ(* ̄0 ̄)3337. poj1845 sumdiv题解

遇到数论题就要推式子!

提供最美丽的latex

\[a^b=p_1^{a_1*b}*p_2^{a_2*b}*p_3^{a_3*b}......*p_n^{a_n*b} \]

那么他的因数之和为:

\[( {p_1}^0+ {p_1}^1+...+ {p_1}^{a_1*b}) \]

\[*( {p_2}^0+ {p_2}^1+...+ {p_2}^{a_2*b}) \]

\[\\...\newline \]

\[*( {p_n}^0+ {p_n}^1+...+ {p_n}^{a_n*b})\newline \]

\[\\=> 利用等比数列:{p_1^{{a_1*b}+1}-1\above 1pt p_1-1}* {p_2^{{a_2*b}+1}-1\above 1pt p_2-1}... {p_n^{{a_n*b}+1}-1\above 1pt p_n-1} \]

分析时间复杂度

\[\sqrt a:分解 \\log2(a)*log2(b):快速幂 \\log2(a):逆元 \\ \sqrt{5e7}*(log2(5e7)+log2(5e7) \\≈7071*(26+26) \\=特别快 \]

ACcode

#include<bits/stdc++.h>
using namespace std;
int x,y,a,b,cnt,flag,m=9901;
void ojld(int a,int b){
	if(!b){
		x=1;
		y=0;
		return;
	}
	ojld(b,a%b);
	int t=y;
	y=x-a/b*t;
	x=t;
	return;
}
int pw(int a,int b){
	int sum=1;
	while(b){
		if(b&1){
			sum=(sum%m*a%m+m)%m;
		} 
		b>>=1;
		a=(a%m*a%m+m)%m;
	}
	return sum%m;
}
signed main(){
	cin>>a>>b;
	int ans=1;
	for(int i=2;a!=1;i++){
		int zhi=0;
		if(a%i==0){
			while(a%i==0){
				a/=i;
				zhi++;
			}
		}
		else{
			continue;
		}
		int fz,fm;
		fz=(pw(i,zhi*b+1)-1+m)%m;
		int t=i-1;
		ojld(t,m);
		fm=(x%m+m)%m;
		ans=(ans%m*fz%m*fm%m+m)%m;
	}
	cout<<ans%m;
	return 0;
}
posted @ 2024-04-19 23:10  LEWISAK  阅读(13)  评论(0)    收藏  举报