1. 程式人生 > >洛谷P2312解方程

洛谷P2312解方程

space ons -h algorithm 明顯 out const splay col

題目描述

已知多項式方程:

a0+a1*x^1+a2*x^2+a3*x^3+.........+an*x^n

求這個方程在 [1,m] 內的整數解(nm 均為正整數)

輸入輸出格式

輸入格式:

n + 2 行。

第一行包含 2 個整數 n, m,每兩個整數之間用一個空格隔開。

接下來的 n+1行每行包含一個整數,依次為 a0,a1,a2,a3,..... a4

輸出格式:

第一行輸出方程在 [1,m] 內的整數解的個數。

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

輸入輸出樣例:

輸入樣例#1:

2 10

1

-2

1

輸出:
1

1

輸入樣例#2:

2 10

2

-3

1

輸出:
2

1

2

輸入樣例#3:

2 10

1

3

2

輸出:
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<10^4

對於 100% 的數據:0<n<=100,|ai|<=10^10000,an≠0,m<10^6

分析:
此題考查的是數論的知識數論什麽的根本不會,在%你賽中遇到此題當場去世,結果我寫個暴力騙了30分,那麽正解呢?

不知道大家有沒有聽說過秦九韶算法(霍納定理),秦九韶算法就是將多項式求值簡化的一個算法,明確的這道題我們可以考慮這樣的做法因為這道題卡的就是代碼的復雜度.

秦九韶算法:
此篇博客不證明此算法,如有需求百度問度娘吧,復雜度一般的多項式求值需要經過(n+1)*n/2的乘法和n次加法十分明顯的這個復雜度是十分大的,

那秦九韶算法的復雜度呢?

這是一個十分優秀的算法它的復雜度僅僅只需n次乘法和n次加法再看看數據大小加上快讀這題就能過了,但是再看數據這麽大的數據這肯定是要麽用高精度要麽瘋狂取模啊

在快讀裏每次模值就可以避免這個問題了

步驟

1.一個循環枚舉區間[1~ m]每一種情況跑一遍秦九韶算法.

2.輸入時我們用快讀邊輸入邊取模.

代碼:

#include <iostream>
#include <iomanip>
#include 
<algorithm> #include <cmath> #include <cstring> #include <string> #include <cstdio> using namespace std; typedef long long LL; const int N=1e6+200; const int mod=1000000007;//註意mod值盡量去一個較大的質數 bool judge; LL a[N],n,m,sum,ans[N],keay; LL calc(LL x) { sum=0; for(LL i=n;i>=1;i--) { sum=(a[i]+sum)*x%mod; } return (sum+a[0])%mod; } LL read() { 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)%mod; c=getchar(); } return sum*fg; } int main() { n=read(); m=read(); for(LL i=0;i<=n;i++) a[i]=read(); for(LL i=1;i<=m;i++) { ans[i]=calc(i); if(ans[i]%mod==0) { judge=true; keay++; } } if(!judge)//如果沒有滿足情況的值 { cout<<0<<endl; return 0; } else { cout<<keay<<endl; for(LL i=1;i<=m;i++) { if(ans[i]==0) cout<<i<<endl; } } return 0; }

洛谷P2312解方程