社区讨论
TLE on test 78 求助
P5605 小 A 与两位神仙参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lr803ikp
- 此快照首次捕获于
- 2024/01/11 00:34 2 年前
- 此快照最后确认于
- 2024/01/11 17:05 2 年前
瓶颈应在
CPPorder() 上,但是无法查明为什么这个函数这么慢捏。求解释,不尽感激。#include <bits/stdc++.h>
using namespace std;
#define int __int128
typedef long long i64;
int mod(int a, int p) {
if (a<p) return a;
return a-p*(a/p);
}
#define mul(a,b,p) (mod((a)*(b),p))
constexpr int MAXN=1e2+10;
i64 p;
mt19937 rnd(time(0));
int qpow(int a, int n, int p) {
int res=1;
while (n) {
if (n&1) res=mul(a,res,p);
a=mul(a,a,p); n>>=1;
}
return res;
}
bool miller_rabin(int a, int x) {
int d=x-1, r=0;
while (!(d&1)) d>>=1, ++r;
int now=qpow(a,d,x);
if (now==x-1||now<=1) return true;
for (int i=1; i<=r; ++i) {
now=mul(now,now,x);
if(now==x-1&&i!=r) {
now=1; break;
}
if (now==1) return false;
}
return now==1;
}
bool isprime(int x) {
if (x<3) return x==2;
if (x%2==0) return 0;
for (int i=1; i<=20; ++i)
if (!miller_rabin(rnd()%(x-1)+1,x)) return false;
return true;
}
int pollard_rho(int x) {
int c=mod(rnd(),x-1)+1, s=0, t=0;
int val=1;
for (int i=1; ; i<<=1) {
val=1; s=t;
for (int step=1; step<=i; ++step) {
t=mod((mul(t,t,x)+c),x);
val=mul(val,t-s>0?t-s:s-t,x);
if (mod(step,127)==0) {
int d=__gcd(val,x);
if (d>1) return d;
}
}
int d=__gcd(val,x);
if (d>1) return d;
}
assert(false);
return -1;
}
int d[MAXN], tot;
void get_fact(int x) {
if (x<2) return;
if (isprime(x)) return d[++tot]=x, void();
int p=x;
while (p>=x) p=pollard_rho(x);
get_fact(p);
get_fact(x/p);
}
int phip;
int order(int x) {
if (x==1) return 1;
int m=phip;
for (int i=1; i<=tot; ++i)
if (qpow(x,m/d[i],p)==1) m/=d[i];
return m;
}
i64 a, b;
void solve() {
cin>>a>>b;
if (mod(order(a),order(b))==0) cout<<"Yes\n";
else cout<<"No\n";
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
i64 T; cin>>p>>T;
get_fact(p); sort(d+1,d+1+tot);
phip=(d[1]-1)*qpow(d[1],tot-1,1e18);
tot=0;
get_fact(phip); sort(d+1,d+1+tot);
assert(tot<=64);
while (T--) solve();
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...