NOIP2014D2T3-解方程

问题描述

已知多项式方程:

a 0 + a 1 x + a 2 x 2 + + a n x n = 0

求这个方程在 [1,m] 内的整数解( n 和 m 均为正整数)。
输入格式
共 n + 2行。
第一行包含 2 个整数 n,m ,每两个整数之间用一个空格隔开。
接下来的 n+1 行每行包含一个整数,依次为 a 0 , a 1 , a 2 a n
输出格式
第一行输出方程在 [1,m] 内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在 [1,m] 内的一个整数解。
样例输入

2 10 
1
-2
1

样例输出

1
1

思路分析

不会….抄大佬博客
怎么求解呢?
其实我们可以把左边的式子当成一个算式来计算,从1到m枚举,只要结果是0,那么当前枚举到的值就是这个等式的解了。可以通过编写一个bool函数来判断算式的值是不是0~
至于如何计算这个看起来又臭又长(雾)的多项式,用秦九韶算法就可以解决啦~
感觉自己证明的不如度娘说得更明白吧,扔个链接好了~
秦九韶公式-百度百科
细节提示
1.不用跑去大牛分站也可以AC辣
2.防爆int常用方法:模大~质数!(另:好像模一个质数有的时候会出事233可以多模几个大质数~)
3.最好用上读入优化,而且边读边取模。
4.sum(见下方代码)每次计算之后一!定!要!清!零!(因为这个不停地10分!摔)

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int p=1000000007;
bool t=true;
int n,m,ans,cnt,sum=0;
int A[103],key[1000003];

long long int read(){
    long long 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;
}

bool calc(long long int x){
    sum=0;
    for(long long int i=n;i>=1;i--)
    {
        sum=((A[i]+sum)*x)%p;
    }
    sum=(sum+A[0])%p;
    return !sum;
}

int main(){
    n=read();
    m=read();
    for(long long int i=0;i<=n;i++)A[i]=read();
    for(long long int i=1;i<=m;i++){
        if(calc(i)){
            t=false;
            ans++;
            key[++cnt]=i;
        }
    }
    if(t){
        cout<<ans<<endl;
        exit(0);
    }
    cout<<ans<<endl;
    for(long long int i=1;i<=cnt;i++)cout<<key[i]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Liukairui/article/details/81284276
今日推荐