解方程 2014NOIP提高组 (数学)
生活随笔
收集整理的這篇文章主要介紹了
解方程 2014NOIP提高组 (数学)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解方程
?
?時間限制: 1 s ?空間限制: 128000 KB ?題目等級 : 鉆石 Diamond? ? ? 題目描述?Description
輸入描述?Input Description
輸入文件名為equation.in。
輸入共n+2行。
第一行包含2個整數n、m,每兩個整數之間用一個空格隔開。
接下來的n+1行每行包含一個整數,依次為a0,a1,a2,……,an。
?
輸出描述?Output Description輸出文件名為equation.out。
第一行輸出方程在[1,?m]內的整數解的個數。
接下來每行一個整數,按照從小到大的順序依次輸出方程在[1,?m]內的一個整數解。
?
?
樣例輸入?Sample Input| equation.in | equation.out |
| 2?10 1 -2 1 ? | 1 1 |
| equation.in | equation.out |
| 2?10 2? -3 1 ? | 2 1 2 |
?
樣例輸出?Sample Output| equation.in | equation.out |
| 2?10 1 3 2 ? | 0 |
?
/* 將每一項的系數都模一個質數, 若一個數是方程的解,那么在模的意義下它也是方程的解(但反過來不一定)。 為了解決這個“不一定”的問題,多選幾個質數, 若一個數在不同模的意義下都是方程的解,那么它有極大的幾率就是原方程的解了。 */ #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector>using namespace std; const int mod[8]= {0,13,7901,3947,131,6977,22877,49997}; char s[105][1000010]; int n,m; int num[9][120];bool solve(int od,int x) {int i,j;long long tmp=0;long long pw=1;for(i=0; i<=n; ++i){if(s[i][0]=='-') tmp=(tmp-pw*num[od][i])%mod[od];else tmp=(tmp+pw*num[od][i])%mod[od];pw=pw*x%mod[od];}while(tmp<0) tmp+=mod[od];if(!tmp)return true;return false; }int res[1000010]; int ans[1000010],act=0;int main() {int i,j,k;scanf("%d%d",&n,&m);for(i=0; i<=n; ++i)scanf("%s",s[i]);int len[101];for(i=0; i<=n; ++i)len[i]=strlen(s[i]);for(k=1; k<=7; ++k)for(i=0; i<=n; ++i){for(j=0; j<len[i]; ++j){if(s[i][j]=='-')continue;num[k][i]=num[k][i]*10+s[i][j]-'0';num[k][i]%=mod[k];}}for(k=1;k<=7;++k)for(i=0; i<mod[k] && i<=m; ++i){if(!solve(k,i))continue;++res[i];for(j=i+mod[k]; j<=m; j+=mod[k]){res[j]++;}}for(i=1; i<=m; ++i)if(res[i]==7)ans[++act]=i;printf("%d\n",act);for(i=1; i<=act; ++i)printf("%d\n",ans[i]);return 0; }?
轉載于:https://www.cnblogs.com/L-Memory/p/7725893.html
總結
以上是生活随笔為你收集整理的解方程 2014NOIP提高组 (数学)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刷完bios怎么设置吗 如何重新设置电脑
- 下一篇: *模板--博弈