您的位置:首页 > 其它

[BZOJ3751][NOIP2014]解方程(乱搞)

2017-09-15 16:09 183 查看
题目:我是超链接

题解:

显然若f(n)≡0(modp),则f(n+p)≡0(modp)。 

所以我们可以选上几个质数,然后check出0-p-1之内的答案,然后由这些答案推出1-m内的答案。选上5个质数就差不多了。(五个质数摘自学姐blog)

代码:

#include <cstdio>
#include <cstring>
using namespace std;
const int Mod[5]={11261,19997,22877,21893,14843};
int ans[1000005],n,m,aa[120],cnt,mi[120];
bool ha[1000005],is[30015];
char a[120][10005];
int pula(int i,int mod)
{
int ans=0,mq=0,ff=1,j,l=strlen(a[i]);
if (a[i][mq]=='-') ff=-1,mq++;
for (j=mq;j<l;j++) ans=ans*10+a[i][j]-'0',ans%=mod;
return ans*ff;
}
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for (i=0;i<=n;i++) scanf("%s",a[i]);
for (i=1;i<=m;i++) ha[i]=1;
for (i=0;i<=4;i++)
{
for (j=0;j<Mod[i];j++) is[j]=1;
for (j=n;j>=0;j--) aa[j]=pula(j,Mod[i]);
for (j=0;j<Mod[i];j++)
{
mi[0]=1;
for (k=1;k<=n;k++) mi[k]=mi[k-1]*j%Mod[i];
int lj=0;
for (k=0;k<=n;k++) lj=(lj+mi[k]*aa[k]%Mod[i])%Mod[i];
if (lj) is[j]=0;
}
for (j=1;j<=m;j++) if (!is[j%Mod[i]]) ha[j]=0;
}
for (i=1;i<=m;i++) if (ha[i]) ans[++cnt]=i;
printf("%d\n",cnt);
for (i=1;i<=cnt;i++) printf("%d\n",ans[i]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: