日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ3751] [NOIP2014] 解方程 (数学)

發布時間:2024/8/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ3751] [NOIP2014] 解方程 (数学) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

已知多項式方程:$a_0+a_1*x+a_2*x^2+...+a_n*x^n=0$ 求這個方程在[1,m]內的整數解(n和m均為正整數)。

Input

第一行包含2個整數n、m,每兩個整數之間用一個空格隔開。 接下來的n+1行每行包含一個整數,依次為a0,a1,a2,...,an。

Output

第一行輸出方程在[1,m]內的整數解的個數。 接下來每行一個整數,按照從小到大的順序依次輸出方程在[1,m]內的一個整數解。

Sample Input

2 10
2
-3
1

Sample Output

2
1
2

HINT

  對于100%的數據,0<n≤100,|ai|≤10^10000,an≠0,m≤1000000。?

Source

Solution

  考慮對等式左邊整體對質數取模,這部分用秦九韶算法實現可以大大提速,并且可以避免大量的高精度運算

  假設模數為$p$,不難發現在模$p$意義下$x$與$x+kp$得到的結果一樣,所以我們可以預處理出$[0,p)$的答案,推出$[1,m]$是否可能是解

  因為$p$很小會有類似哈希沖撞的事發生,所以我們可以選取多個$p$。據說是選$5$個$20000$左右的質數就可以,然而我換過好幾個質數,不是$WA$就是$TLE$,QAQ

  代碼里的質數是網上找的,并不清楚為什么這人的人品能那么好QAQ,$4$個質數就可以$AC$QAQ

  (方法會就行了,這道題考的不是質數的選取,質數照抄就行了)

1 #include <bits/stdc++.h> 2 using namespace std; 3 char s[105][10005]; 4 int p[4] = {17389, 22349, 22367, 22369}; 5 int n, a[105], ans[1000005]; 6 bool vis[5][27005]; 7 8 bool check(int x) 9 { 10 if(!vis[0][x % 17389]) return false; 11 if(!vis[1][x % 22349]) return false; 12 if(!vis[2][x % 22367]) return false; 13 if(!vis[3][x % 22369]) return false; 14 return true; 15 } 16 17 bool is_zero(int k, int x) 18 { 19 long long ans = a[n]; 20 for(int i = n - 1; ~i; --i) 21 ans = (ans * x + a[i]) % p[k]; 22 return !ans; 23 } 24 25 int main() 26 { 27 int m, tot = 0; 28 scanf("%d%d", &n, &m); 29 for(int i = 0; i <= n; ++i) 30 scanf("%s", &s[i]); 31 for(int i = 0; i < 4; ++i) 32 { 33 memset(a, 0, sizeof(a)); 34 for(int j = 0; j <= n; ++j) 35 if(s[j][0] == '-') 36 for(int k = 1; s[j][k]; ++k) 37 a[j] = (a[j] * 10 - s[j][k] + 48 + p[i]) % p[i]; 38 else 39 for(int k = 0; s[j][k]; ++k) 40 a[j] = (a[j] * 10 + s[j][k] - 48) % p[i]; 41 for(int j = 1; j < p[i]; ++j) 42 vis[i][j] = is_zero(i, j); 43 } 44 for(int i = 1; i <= m; ++i) 45 if(check(i)) ans[++tot] = i; 46 printf("%d\n", tot); 47 for(int i = 1; i <= tot; ++i) 48 printf("%d\n", ans[i]); 49 return 0; 50 } View Code

?

轉載于:https://www.cnblogs.com/CtrlCV/p/5620082.html

總結

以上是生活随笔為你收集整理的[BZOJ3751] [NOIP2014] 解方程 (数学)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。