AcWing - 515 - 解方程 = 简单数学

你说的曾经没有我的故事 提交于 2019-12-01 06:17:07

https://www.acwing.com/problem/content/517/

给一个多项式,求他的整数根。

首先稳妥的办法应该是整一大堆质数,然后用中国剩余定理合并(当然不是真的合并)。

奇怪一点的就用几个就可以了,卡掉的概率极低,加上是OI其实没问题的。

但是这题卡常,要用秦九韶公式卡掉一半的乘法(和取模),还卡读入,真的垃圾题。

注意读入的时候要%p而不是-p,找到一个写法的bug不错。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXP = 1;
const int p = 19260817;

int ap[105];

inline int read() {
    int b = 0;
    char c = getchar();
    while(true) {
        if(c == '-' || (c >= '0') && (c <= '9'))
            break;
        c = getchar();
    }
    if(c == '-') {
        b = 1;
        c = getchar();
    }
    int cur = 0;
    while(c >= '0' && c <= '9') {
        cur = (cur << 3) + (cur << 1) + (c - '0');
        if(cur >= p)
            cur %= p;
        c = getchar();
    }
    if(b)
        cur = (p - cur) % p;
    return cur;
}

inline void write(int x) {
    if(x <= 9) {
        putchar('0' + x);
    } else {
        write(x / 10);
        putchar('0' + x % 10);
    }
}

int ans[1000005];
int atop = 0;

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int n = read(), m = read();
    for(int i = 0; i <= n; ++i)
        ap[i] = read();

    for(int x = 1; x <= m; ++x) {
        ll cur = 0;
        for(int i = n; i >= 1; --i) {
            cur = (cur + ap[i]) * x;
            if(cur >= p)
                cur %= p;
        }
        cur = (cur + ap[0]) % p;
        if(cur == 0)
            ans[++atop] = x;
    }

    write(atop);
    putchar('\n');
    for(int i = 1; i <= atop; ++i) {
        write(ans[i]);
        putchar('\n');
    }
    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!