质数表的范围不是5e7?+不能预处理a%=mod?+94分#13求助
  • 板块P1593 因子和
  • 楼主w_y_c
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/2/17 13:01
  • 上次更新2023/11/5 03:10:08
查看原帖
质数表的范围不是5e7?+不能预处理a%=mod?+94分#13求助
19141
w_y_c楼主2021/2/17 13:01

三个问题求大佬帮看看

  1. 看题解知道了可以不用打表 但是抄了一份别人博客上打了表的数据范围不是5e7的也过了 就很疑惑 a如果是一个比较大的质数怎么办呢

  2. 用的是分治写的等比数列求和 于是我的所有运算过程都没有牵涉到除法 那么a%mod的这个预处理感觉就没毛病..

  3. 牛客和acwing过了 洛谷和poj没过...洛谷94分#13wa

#include <iostream>
#include <cmath>
#include <cstring>
#include <vector>
typedef long long ll;
using namespace std;

const ll mod=9901;
const int N=1e6+10;
bool notPrime[N];
vector<int>prime;
void init()
{
    for (int i=2; i<sqrt(N); i++) {
        if (notPrime[i]) {
            continue;
        }
        for (int j=i; j*i<N; j++) {
            notPrime[i*j]=1;
        }
    }
    for (int i=2; i<N; i++) {
        if (!notPrime[i]) {
            prime.push_back(i);
        }
    }
}

ll power(ll x,int n) {
    ll ret=1;
    x%=mod;
    while (n) {
        if (n&1) {
            ret=ret*x%mod;
        }
        x=x*x%mod;
        n>>=1;
    }
    return ret;
}

ll solve(int x,int b) {
    //x^0+....+x^b
    if (b==0) {
        return 1;
    }
    if (b&1) {
        return ((1+power(x, b/2+1))%mod*solve(x, b/2)%mod);
    } else {
        return (((1+power(x, b/2))%mod*solve(x, b/2-1)%mod)+power(x, b))%mod;
    }
}

int main(int argc, const char * argv[]) {
    int b,len;
    ll a,ans;
    vector<int>div;//质数除数
    vector<int>divNum;//质数除数的个数
    init();
    len=prime.size();
    while (cin>>a>>b) {
        div.clear();
        divNum.clear();
        for (int i=0; i<len; i++) {
            if (a<prime[i]) {
                break;
            }
            if (a%prime[i]==0) {
                div.push_back(prime[i]);
                ll tt=a;
                int cnt=0;
                while (tt%prime[i]==0) {
                    tt/=prime[i];
                    cnt++;
                }
                divNum.push_back(cnt);
            }
        }
        ans=a>0;
        int num=div.size();
        for (int i=0; i<num; i++) {
            ans*=solve(div[i],b*divNum[i]);
            ans%=mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}

2021/2/17 13:01
加载中...