社区讨论
数论题求调
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m12honhc
- 此快照首次捕获于
- 2024/09/15 02:37 去年
- 此快照最后确认于
- 2025/11/04 21:14 4 个月前
题目大意: 给定 ,,求 的约数和 模 。。(洛谷上没找到原题)
思路: 令 ,则
的约数和为
用乘法逆元和欧拉定理(忘了是不是这个名字)得
代码:
CPP#include<bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const ll MAXFAC=45;
const ll MOD=1e9+7;
ll a,b;
ll afact[MAXFAC],afactpow[MAXFAC],afactcnt=1;
ll qpow(ll a,ll b){
ll base=a,ans=1ll;
while(b){
if(b&1)
(ans*=base)%=MOD;
(base*=base)%=MOD;
b>>=1;
}
return ans;
}
int main(){
ll i,j;
freopen("sumdiv.in","r",stdin);
freopen("sumdiv.out","w",stdout);
cin>>a>>b;
ll newb=b%(MOD-1);
for(i=2;i*i<=a;i++){
if(a==1)
break;
bool flag=0;
while(a%i==0){
if(!flag){
flag=1;
afact[afactcnt]=i;
afactpow[afactcnt]=1;
}
else
afactpow[afactcnt]++;
a/=i;
}
if(flag)
afactcnt++;
}
if(a>1){
afact[afactcnt]=a;
afactpow[afactcnt]=1;
afactcnt++;
}
//for(i=1;i<afactcnt;i++)
// cout<<afact[i]<<' '<<afactpow[i]<<endl;
ll ans=1;
for(i=1;i<afactcnt;i++){
ll afapow=(newb*afactpow[i]+1)%(MOD-1);
(ans*=(qpow(afact[i],afapow)-1+MOD))%=MOD;
(ans*=qpow(afact[i]-1,MOD-2))%=MOD;
}
cout<<ans<<endl;
return 0;
}
目前 79 分(WA)
回复
共 1 条回复,欢迎继续交流。
正在加载回复...