Cryptographically Secure PRNG
這個題打表找到的規律,卡常,因爲求逆元是log級別的,所以如果用快速冪求逆元會T,所以求逆元需要用到遞推公式。
遞推公式
inv[i]代表i對於質數p的逆元
inv[i]=(p-p/i)*inv[p%i]%p;
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#pragma GCC optimize(3)//O3
#pragma GCC optimize(2)//O2
inline long long pow_mod(long long a,int n,long long m){
long long ans=1;
while(n){
if(n&1){
ans=(ans*a)%m;
}
a=(a*a)%m;
n>>=1;
}
return ans;
}
int vx[10100],vfx[10100],wx[10100],wfx[10100];
inline void write(int X){
if(X>9) write(X/10);
putchar(X%10+'0');
}
long long inv[1010000];
int main(void){
int T,i,p;
scanf("%d",&T);
inv[1]=1;
while(T--){
scanf("%d",&p);
int minl=p;
int minf=p;
int cnt1=0,cnt2=0;
for(i=2;i<minf;i++){
//int x=pow_mod(i,p-2,p);
inv[i]=(p-p/i)*inv[p%i]%p;
int x=inv[i];
if(x<minf){
if(x!=i){
vx[++cnt2]=x;
vfx[cnt2]=i;
}
minf=x;
}
minl=min(minl,x);
if(minl==x){
wx[++cnt1]=i;
wfx[cnt1]=x;
}
}
int len=cnt1+cnt2;
write(len);
putchar('\n');
for(i=1;i<=cnt1;i++){
write(wx[i]);
putchar(' ');
write(wfx[i]);
putchar('\n');
}
for(i=cnt2;i>=1;i--){
write(vx[i]);
putchar(' ');
write(vfx[i]);
putchar('\n');
}
}
return 0;
}