luogu P2312 解方程
阿新 • • 發佈:2017-09-23
ios 優化 put clas lac toolbar type pre ati
題目描述
已知多項式方程:
a0+a1x+a2x^2+..+anx^n=0
求這個方程在[1, m ] 內的整數解(n 和m 均為正整數)
輸入輸出格式
輸入格式:
輸入文件名為equation .in。
輸入共n + 2 行。
第一行包含2 個整數n 、m ,每兩個整數之間用一個空格隔開。
接下來的n+1 行每行包含一個整數,依次為a0,a1,a2..an
輸出格式:
輸出文件名為equation .out 。
第一行輸出方程在[1, m ] 內的整數解的個數。
接下來每行一個整數,按照從小到大的順序依次輸出方程在[1, m ] 內的一個整數解。
輸入輸出樣例
輸入樣例#1:2 10 1 -2 1輸出樣例#1:
1 1輸入樣例#2:
2 10 2 -3 1輸出樣例#2:
2 1 2輸入樣例#3:
2 10 1 3 2輸出樣例#3:
0
說明
對於30%的數據:0<n<=2,|ai|<=100,an!=0,m<100
對於50%的數據:0<n<=100,|ai|<=10^100,an!=0,m<100
對於70%的數據:0<n<=100,|ai|<=10^10000,an!=0,m<10000
對於100%的數據:0<n<=100,|ai|<=10^10000,an!=0,m<1000000
#include<algorithm> #include<iostream> #include<iomanip> #include<cstring> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; const int p=1000000007;//取模比較方便qwq為了防止出現奇怪的錯誤建議多模幾個質數 bool t=true;//用來判斷是否有解 int n,m,ans,cnt,sum=0;//cnt記錄解的個數;sum用來計算多項式的結果 int A[103],key[1000003]; //A[]記錄式中的a0,a1,a2(註意是以0為起點) //key記錄每個解的值 ll read()//讀入優化(似乎不加會T兩個點w) { ll sum=0,fg=1; char c=getchar(); while(c < ‘0‘ || c > ‘9‘) { if(c==‘-‘) fg=-1;//如果讀到負號則記錄 c=getchar(); } while(c >=‘0‘ && c <=‘9‘) { sum=((sum*10)+c-‘0‘)%p; //註意因為A[]可能很大,所以讀入時就要進行取模操作 c=getchar(); } return sum*fg; //如果是負數(fg==-1,即讀到了負號)那麽返回的值為負數 } void print(int x)//輸出優化(這個可以不加qwq) { if(x<0) { putchar(‘-‘); x=-x; } if(x>9) { print(x/10); } putchar(x%10+‘0‘); } bool calc(ll x) { sum=0;//一定要清零!!!(不然只有10分嗚嗚嗚) for(ll i=n;i>=0;i--) { sum=((A[i]+sum)*x)%p; //這裏套用秦九韶算法求多項式的值 } return !sum;//如果答案是0說明x值為該多項式的解,返回1(true) } int main() { n=read(); m=read(); for(ll i=0;i<=n;i++) { A[i]=read(); } for(ll i=1;i<=m;i++) { if(calc(i))//如果返回的是1(true)則說明有解 { t=false; ans++;//記錄答案個數 key[++cnt]=i;//記錄每個解的值 } } if(t) { cout<<ans<<endl;//如果t未改變則說明解的個數為0 return 0; } print(ans); printf("\n"); for(ll i=1;i<=cnt;i++) { print(key[i]); printf("\n"); } return 0; }
luogu P2312 解方程