方程式を解く問題に羅区P2312ソリューション

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; 
}

おすすめ

転載: www.cnblogs.com/acioi/p/11725908.html