1. 程式人生 > >luogu P2312 解方程

luogu P2312 解方程

ios 優化 put clas lac toolbar type pre ati

題目描述

已知多項式方程:

a0+a1x+a2x^2+..+anx^n=0

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

輸入輸出格式

輸入格式:

輸入文件名為equation .in。

輸入共n + 2 行。

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

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

輸出格式:

輸出文件名為equation .out 。

第一行輸出方程在[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%的數據: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<10000

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

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int p=1000000007;//取模比較方便qwq為了防止出現奇怪的錯誤建議多模幾個質數 
bool t=true;//用來判斷是否有解 
int n,m,ans,cnt,sum=0;//cnt記錄解的個數;sum用來計算多項式的結果 
int A[103],key[1000003];
//A[]記錄式中的a0,a1,a2(註意是以0為起點)
//key記錄每個解的值 
ll read()//讀入優化(似乎不加會T兩個點w) 
{
    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‘)%p;
        //註意因為A[]可能很大,所以讀入時就要進行取模操作 
        c=getchar();
    }
    return sum*fg;
    //如果是負數(fg==-1,即讀到了負號)那麽返回的值為負數 
}
void print(int x)//輸出優化(這個可以不加qwq) 
{
    if(x<0)
    {
        putchar(‘-‘);
        x=-x;
    }
    if(x>9)
    {
        print(x/10);
    }
    putchar(x%10+‘0‘);
}
bool calc(ll x)
{
    sum=0;//一定要清零!!!(不然只有10分嗚嗚嗚) 
    for(ll i=n;i>=0;i--)
    {
        sum=((A[i]+sum)*x)%p;
        //這裏套用秦九韶算法求多項式的值 
    }
    return !sum;//如果答案是0說明x值為該多項式的解,返回1(true) 
}
int main()
{
    n=read();
    m=read();
    for(ll i=0;i<=n;i++)
    {
        A[i]=read();
    }
    for(ll i=1;i<=m;i++)
    {
        if(calc(i))//如果返回的是1(true)則說明有解 
        { 
            t=false; 
            ans++;//記錄答案個數 
            key[++cnt]=i;//記錄每個解的值 
        }
    }
    if(t)
    {
        cout<<ans<<endl;//如果t未改變則說明解的個數為0 
        return 0;
    }
    print(ans);
    printf("\n");
    for(ll i=1;i<=cnt;i++)
    {
        print(key[i]);
        printf("\n");
    }
    return 0;
}

  

luogu P2312 解方程