Wannafly Winter Camp Day5 G題

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;
}
發佈了62 篇原創文章 · 獲贊 6 · 訪問量 1951
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章