noip2014火柴排队--hash题?

链接:https://www.luogu.org/problemnew/show/P2312

一开始看了很久毫无思路,用秦九韶算法n*m因为高精度而gg,最后看题解发现是取模之后计算(一种类似哈希的搞法?)一个模数可能不稳,可能要想多模hash一样多搞几个,但因为出题人把n*m设为1e8也不知道是什么鬼怕tle就只写一个模数了。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
int a[110],n,m;
void read(int &x)
{
    char c=getchar();int r=1;
    while(!isdigit(c))
    {
        if(c=='-')r=-1;
        c=getchar();
    }
    while(isdigit(c))x=(1LL*x*10+c-48)%mod,c=getchar();
    x*=r;x=(x+mod)%mod;
}
void write(int x)
{if(x>=10)write(x/10);putchar('0'+x%10);}
int main()
{
    int nw;vector<int>res;
    read(n),read(m);
    for(int i=0;i<=n;i++)
        read(a[i]);
    for(int i=1;i<=m;i++)
    {
        nw=0;
        for(int j=n;j>=0;j--)
        {
            nw=(1LL*nw*i+a[j])%mod;
        }
        if(!nw)res.push_back(i);
    }
    write(res.size()),puts("");
    for(int i=0;i<res.size();i++)
        write(res[i]),puts("");
} 

猜你喜欢

转载自blog.csdn.net/caoyang1123/article/details/81586740