先建立一張平方表
table[i] = {1 4 9 16 .... 2147395600(46340^2) } (for i = 1 ~ 46340)
然後就從表裡拿出資料試table[i],若是table[i] mod m ≡ 1,就輸出i
不曉得這樣會不會太慢,有公佈測資嗎?
不用建那麼大,實際上只有for i = 1 ~ 46340
table[1]=1^2=1
table[2]=2^2=4
table[3]=3^2=9
...
table[46340]=46340^2= 2147395600
#include <iostream>
using namespace std;
#define MAXSIZE 46340
int table[MAXSIZE+1];
int ans[MAXSIZE],count;
void maketable(){
for(int i=1;i<=MAXSIZE;i++)
table[i]=i*i;
}
int main(){
int m;
int i;
maketable();
while(cin >> m){
count=0;
for(i=1;i<=MAXSIZE;i++){
if(i>m) break;
if(table[i]%m==1) ans[count++]=i;
}
cout << count << endl;
for(i=0;i<< ans[i] << endl;
}
return 0;
}
赫然發現我少考慮另一部分
想得太簡單了
這題你不是在NPSC補完計畫問過了.....
http://www4.tcgs.tc.edu.tw/0/view.asp?b=2100&r=29524