3408 - 解方程
时间限制 : 1 秒
内存限制 : 128 MB
已知多项式方程:
�!+�!�+�!�
!+⋯+�!�
!=0
求这个方程在[1, m]内的整数解(n和m均为正整数)
题目输入
输入文件名为equation.in。
输入共n+2行。
第一行包含2个整数n、m,每两个整数之间用一个空格隔开。
接下来的n+1行每行包含一个整数,依次为�!
,�!
,�!
,…,�!
题目输出
输出文件名为equation.out。
第一行输出方程在[1, m]内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m]内的一个整数解
输入/输出样例
输入格式
2 10 1 -2 1
输出格式
1 1
C++解答
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 110 using namespace std; typedef long long ll; const int prime[]={10007,11261,14843,19997,21893}; int n,m,stack[1001001],top; ll a[M][5],f[21893][5]; inline ll F(int x,int j){ int i; ll re=0; for(i=n;~i;i--) re=(re*x+a[i][j])%prime[j]; return re; } inline void Input(int x){ static char s[10100]; int i,j; bool flag=false; scanf("%s",s+1); for(i=1;s[i];i++){ if(s[i]=='-')flag=true; else for(j=0;j<5;j++) a[x][j]=((a[x][j]<<1)+(a[x][j]<<3)+s[i]-'0')%prime[j]; } if(flag)for(j=0;j<5;j++)a[x][j]=prime[j]-a[x][j]; } int main(){ int i,j; cin>>n>>m; for(i=0;i<=n;i++) Input(i); for(j=0;j<5;j++) for(i=0;i<prime[j];i++) f[i][j]=F(i,j); for(i=1;i<=m;i++){ for(j=0;j<5;j++) if(f[i%prime[j]][j])break; if(j==5)stack[++top]=i; } cout<<top<<endl; for(i=1;i<=top;i++)printf("%d\n",stack[i]); }