P2312の解決の方程式
タイトル説明
既知の多項式:
\ [A_0 + a_1x + a_2x ^ 2 + \ cdots + a_nx ^ N = 0 \]
[1、M] [1、で M] この式において整数解を見つける(\(N- \)と\(m個\)は共に正の整数です)。
入力形式
入力コモン$ nは+ 2 $行。
最初の行は含ま\(2 \)整数\(N、M \) 、スペースで区切られた2つの整数の間でそれぞれ。
次の(n + 1 \)\続く行は整数を含み、\(A_0、A_1、A_2 \ ldots A_N \) 。
出力フォーマット
整数解の最初の方程式の出力ライン番号[1、M] [1、M]。
次に、小から大へ順に各行溶液の整数、式中の整数[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%、30%\(| a_iを| \ル100、A_N≠0、M <100 \ 0 <N- \ル2) 。
データの50%、50%:\(0 <N- \ル100、| a_iを| \ル^ {10} 100、A_N≠0、M <100 \) 。
データについては70%、70%:\(0 <N- \ル100、| a_iを| \ル^ {10} 10000、A_N≠0、M <10 4 ^ \。) 。
100%〜100%のデータ:\(0 <N- \ル100、| a_iを| \ル^ {10} 10000、A_N≠0、M <10 6 ^ \。) 。
[思考]
秦九韶式モード+ +高速な読み取り数学、数論
[タイトル]効果
式の範囲内の範囲を必要なソリューションの数を考えると
[解析]タイトル
M <= 1E6、列挙することができる
ので、mは良い選択のある列挙
方程式ソルバ?代数は試すことができます
が、代数的複雑さが高すぎる
表情秦九韶式で破壊することができ
、非常に簡単なような公式を覚えている、の後ろ、またはBaiduのを見て言葉を説明していません
複雑さを軽減するために
[コア]アイデア
列挙メートル
、mは方程式がどのように判断することではない
だけの式のトライにメートルに必要
:NOTE
ここでの方程式の方程式を秦九韶が分解を式の後
のような答えをしてから出力する最終カウントを記録します
【秦九韶公式】
\(A_0 + + a_2x a_1x ^ 2 + ... + a_3x。3 ^ + ^ N-a_nx \)
\(X = A_0 +(A_1 a_2x + + 2 + ... + a_3x a_nx ^ {^ 1-N- })\)
\(= .... \)
これはトップの方法です
数回はしなかった当事者であることができ
、未知数の数は、状況の最初のパワーです
あなたは多くの計算を減らすことができるように
[完了コード】
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int p = 1e9 + 7;
inline int read()
{
int 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;
c = getchar();
}
return sum * fg;
}
int a[105];
int ans[1000006];
int n,m;
bool check(int x)
{
int sum = 0;
for(register int i = n;i >= 1;i --)
{
sum = (x * (a[i] + sum)) % p ;
}
sum = (sum + a[0]) % p;
if(sum == 0)return true;
else return false;
}
signed main()
{
freopen("au.out","r",stdin);
n = read();m = read();
for(register int i = 0;i <= n;++ i)
a[i] = read();
int js = 0;
for(register int i = 1;i <= m;++ i)
if(check(i) == true)
ans[++ js] = i;
cout << js << endl;
for(register int i = 1;i <= js;++ i)
cout << ans[i] << endl;
return 0;
}