#include #define BSIZE 1000000000 //k … nを2x5進法で表したときの桁数(ex: n=1024 then k=1000) #define decimals(n,k) do{k=1;if((n)/(k)>=100000) (k)*=100000;if((n)/(k)>=10000) (k)*=10000;if((n)/(k)>=1000) (k)*=1000;if((n)/(k)>=100) (k)*=100;if((n)/(k)>=10) (k)*=10;}while(0) char readbuf[BSIZE+1],writebuf[BSIZE+1]; int _read=0,_write=0; /** *@brief n^m mod pを求める *@details モンゴメリ演算を使わない ~手抜き~ シンプルな繰り返し二乗法で計算する。 *@note 計算量はΘ(log m) *@param n 底 *@param m 指数 *@param p 法 *@return n^m mod pを返す */ unsigned modPow(unsigned n,unsigned m,unsigned p){ unsigned ans=1; while(m){ if((m&1)!=0){ //mの最下位ビットが1なら ans=(unsigned long long)ans*n%p; } m/=2; n=(unsigned long long)n*n%p; } return ans; } /** *@details ミラーラビンの1ステップ,2工程目@n * a^dに対して、二乗をs回繰り返し、どこかで-1が出れば素数の可能性がある *@note 計算量はΘ(s)@n *s<=log(n)なので、Θ(logn) *@param [in] n 素数判定したい3以上の奇数n *@param [in] ad 1工程目で求めた数a^d *@param [in] s n-1を素因数分解した際の2の数 *retval -1 nが素数の可能性がある *retval 0 nが確実に合成数 */ int millerStepSecond32(unsigned n,unsigned ad,unsigned s){ int i=0; while(i32); return ans; } // 非負整数を出力するサブルーチン(n…出力する数,br…区切り文字) void outputu(unsigned n,char br){ register unsigned tmp=n,k=1,dif; decimals(tmp,k); do{ dif=tmp/k; writebuf[_write++]=dif+'0'; tmp-=(dif*k);k/=10; }while(k); br&&(writebuf[_write++]=br); } int main(int argc,char *argv[]){ read(STDIN_FILENO,readbuf,BSIZE); //入力を一括読み込み int n; n=inputu(); for(int i=0;i