三个问题求大佬帮看看
看题解知道了可以不用打表 但是抄了一份别人博客上打了表的数据范围不是5e7的也过了 就很疑惑 a如果是一个比较大的质数怎么办呢
用的是分治写的等比数列求和 于是我的所有运算过程都没有牵涉到除法 那么a%mod的这个预处理感觉就没毛病..
牛客和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;
}