救命!!!!

P1593 因子和

WangHuiKai2 @ 2024-10-04 17:06:16

#include<bits/stdc++.h>
using namespace std;
int a,b,z[100],m=0,zz[100];
long long ans=1,ans1=1,ans2=0;
bool v[50000010];
int s[600010], cnt = 0;
void w(int n){
    v[1]=1;
    for(int i=2;i<=n;i++){
        if(v[i]==0){
            s[++cnt]=i;
        }
        for(int j=1;j<=cnt&&s[j]*i<=n;j++){
            v[i*s[j]]=1;
            if(i%s[j]==0){
                break;
            }
        } 
    }
}int main(){

    cin>>a>>b;
    if(v[a]==1){
        for(int i=0;i<=b;i++){
            ans2=ans2+pow(a,i);
            ans2%=9901;
        }
        cout<<ans2%9901;
        return 0;
    }
    for(int i=2;i<=a;i++){
        while(a%i==0&&v[i]==1){
            z[i]++;
            zz[++m]=i;
            a/=i;
        }
    }
    for(int i=1;i<=m;i++){
        cout<<z[i]<<' ';
    }
    for(int i=1;i<=m;i++){
        if(z[zz[i]]>1){
            for(int j=1;j<=z[zz[i]]*b;j++){
                while(j>0){
                    if(j%2!=0){
                        ans1=ans1*zz[i]%9901;
                    }
                    zz[i]=zz[i]*zz[i]%9901;
                    j=j>>1;
                }
            }
        }
        if(z[zz[i]]==1) {
            for(int j=1;j<=b;j++){
                while(j>0){
                    if(j%2!=0){
                        ans1=ans1*zz[i]%9901;
                    }
                    zz[i]=zz[i]*zz[i]%9901;
                    j=j>>1;
                }
            }
        }
        ans*=ans1;
        ans%=9901;
    }
    cout<<ans;
    return 0;
}

输出一直不对,前面是欧拉筛,后面是快速幂和约数和公式,求dalao救命


by Tmbcan @ 2024-10-04 17:54:28

关于素数筛:

你代码里的做法跟我说的本质上是一样的,筛一遍素数还会多一个常数(并且你并没有调用素数筛,)

对于约数和公式:


|