w_y_c @ 2021-02-17 13:01:48
三个问题求大佬帮看看
看题解知道了可以不用打表 但是抄了一份别人博客上打了表的数据范围不是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; ji<N; j++) { notPrime[ij]=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=retx%mod; } x=xx%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))%modsolve(x, b/2)%mod); } else { return (((1+power(x, b/2))%modsolve(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; }
by w_y_c @ 2021-02-17 13:02:35
上面的代码糊了 重新来一份...
#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;
}
by w_y_c @ 2021-03-07 15:11:05
过了一段时间重新来看 自问自答 过不了的那个点就是这个帖子 https://www.luogu.com.cn/discuss/show/52497
里的大质数那一组数据
49999991 2
答案3423
不能预处理取模是因为我们是要对因数和取模 而不是对a^b取模 所以取模之后数据含义发生变化
by justforu @ 2023-11-07 09:02:24
感谢这组数据,卡在13了