数论题求调
  • 板块学术版
  • 楼主lgmulti
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/15 02:36
  • 上次更新2024/9/15 11:36:52
查看原帖
数论题求调
54769
lgmulti楼主2024/9/15 02:36

题目大意: 给定 AA,BB,求 ABA^B 的约数和 SSP=109+7P = 10^9 + 7A1012,B1018A \leq 10^{12}, B\leq 10^{18}。(洛谷上没找到原题)

思路:A=i=1naipiA = \prod_{i=1}^n a_i^{p_i},则 AB=i=1naiBpiA^B = \prod_{i=1}^n a_i^{Bp_i} ABA^B 的约数和为 S=i=1n(j=0Bpiaij)=i=1n(aiBpi+11ai1)S = \prod_{i=1}^n \left( \sum_{j=0}^{Bp_i} a_i^j \right) = \prod_{i=1}^n \left(\frac{a_i^{Bp_i+1} - 1}{a_i - 1}\right) 用乘法逆元和欧拉定理(忘了是不是这个名字)得 Si=1n((aiBpi+1modφ(P)1)(ai1)1)(modP)S \equiv \prod_{i=1}^n \left( (a_i^{Bp_i+1 \bmod \varphi(P)} - 1)(a_i - 1)^{-1} \right) \pmod P

代码:

#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)

2024/9/15 02:36
加载中...