2025.2.11模拟赛总结
wangzilong913 · · 个人记录
学了数论,整个人都麻了。比赛更是惨不忍睹,600分的题,拿了195分qaq
T1 scrape together
考时20分qaq,还是打表打出来的qwq
题意很简单,就是算由
举点例子
当
当
当$N=10000000000
2.求满足
3.求满足
其中
边读题我们就可以看出,此题纯考板子。第1个是快速幂,第2个是扩展欧几里得算法求线性同余方程,第3个是BSGS算法(Baby Btep Giant Step算法、大步小步算法)。
只要熟练掌握它们,此题极易。
代码环节
#include <bits/stdc++.h>
#define int long long
using namespace std;
int ksm(int a,int b,int p){
int ans = 1;
while(b){
if(b & 1) ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans;
}
int exgcd(int a,int b,int &xx,int &yy){
if(b == 0){
xx = 1;
yy = 0;
return a;
}
int d = exgcd(b,a%b,xx,yy);
int z = xx;
xx = yy;
yy = z - (a/b)*xx;
return d;
}
int BSGS(int a,int b,int p){
/*unordered_*/map <int,int> m;
m.clear();
b %= p;
int t = (sqrt(p))+1;
for(int i = 0;i < t;i++){
int v = b * ksm(a,i,p) % p;
m[v] = i;
}
a = ksm(a,t,p);
if(a == 0){
if(b == 0) return 1;
else return -114514;
}
for(int i = 0;i <= t;i++){
int v = ksm(a,i,p);
int j;
if(m.find(v) == m.end()) j = -114514;
else j = m[v];
if(t * i - j>= 0 && j >= 0) return t * i - j;
}
return -114514;
}
signed main(){
int t,k;
cin>>t>>k;
if(k == 1){
while(t--){
int y,z,p;
cin>>y>>z>>p;
cout<<ksm(y,z,p)<<endl;
}
}
if(k == 2){
while(t--){
int y,z,p;
cin>>y>>z>>p;
int xx,yy,d;
d = exgcd(y,p,xx,yy);
if(z % d == 0){
int ans = xx * (z/d);
ans = (ans % (p/d) + (p/d)) % (p/d);
cout<<ans<<endl;
}
else cout<<"Orz, I cannot find x!"<<endl;
}
}
if(k == 3){
while(t--){
int y,z,p;
cin>>y>>z>>p;
int xx = BSGS(y,z,p);
if(xx != -114514) cout<<xx<<endl;
else cout<<"Orz, I cannot find x!"<<endl;
}
}
return 0;
}
T4 SquarePair
洛谷 AT_abc342_d [ABC342D] Square Pair