【noip2014】 解方程

一开始想的是快速幂 然而复杂度不对

后来发现秦九韶算法 可以O(n)计算n次多项式

https://baike.baidu.com/item/%E7%A7%A6%E4%B9%9D%E9%9F%B6%E7%AE%97%E6%B3%95/449196?fr=aladdin

然后就卡着时间过了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105,maxm=1e6+5;
const int magic=19260817;
int a[maxn];
int n,m;

void read(int &x)
{
    x=0;int f=1;char ch;
    for(;;)
    {
        ch=getchar();
        if(ch=='-'){f=-1;ch=getchar();break;}
        if(ch>'9'||ch<'0');else break;
    }
    for(;;)
    {
        x*=10;x+=ch-'0';x%=magic;ch=getchar();
        if(ch<'0'||ch>'9')break;
    }x*=f;
}

int qpow(int x,int k)
{
    if(!k)return 1;if(k==1)return x;
    if(k&1)return 1ll*qpow(x*x%magic,k>>1)*x%magic;
    else return qpow(x*x%magic,k>>1);
}

int check(int v)
{
    ll sum=a[n];
    for(int i=n-1;i>=0;i--)
    {
        sum*=v;sum+=a[i];sum%=magic;
    }
    return sum==0?1:0;
}

vector<int>out;

int main()
{
    scanf("%d%d",&n,&m);
    
    for(int i=0;i<=n;i++)
    {
        read(a[i]);
    }
    int ans=0;
    
    for(int i=1;i<=m;i++)
    {
        if(check(i))
        {
            ans++;out.push_back(i);
        }
    }
    printf("%d\n",ans);
    for(int i=0;i<(int)out.size();i++)
    {
        printf("%d\n",out[i]);
    }
    return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值