4 2 1 1 -5 7 1 5 -2995 9929 2 1 -96255532 8930 9811 4 14 5458 7754 4946 -2210 9601
Case #1: No solution! Case #2: 599 Case #3: 96255626 Case #4: No solution!
2013 ACM-ICPC长沙赛区全国邀请赛——题目重现
有点郁闷,纠结很久还是不懂。。。
思路:能被pi*pi整除,必定能被pi整除,所以可以先判断nengfoubeipi整除,以此优化算法
问题:不懂为什么求出一个能被pi整除的数后每次循环是加pi。。。
另注:打表会T
#include <iostream> #include <cstdio> #include <string.h> using namespace std; int T,n,a[5],pri,flag,ncase,i,ans,j; long long fx(int x,int p)//求f(x)取模P的函数 { long long sum = 0; int i; for(i = n; i >= 0; i--) sum = (a[i] + sum * x ) % p; return (sum % p); } int main() { cin >> T; while(T--) { ncase++; memset(a,0,sizeof(a)); flag = 0; cin >> n; for(i = n; i >= 0; i--) cin >> a[i]; cin >> pri; for(j = 0; j < pri; j++) { if(fx(j,pri) == 0) for(i = j; i < pri * pri; i+=pri) //这里不懂 { if(fx(i,pri * pri) == 0) { if(!flag) ans = i; flag++; } if(flag > 1) break; } } printf("Case #%d: ",ncase); if(!flag ) printf("No solution!\n"); else printf("%d\n",ans); } return 0 ; }
#include <iostream> #include <cstdio> #include <string.h> using namespace std; int T,n,a[5],pri,flag,ncase,i,ans,j; long long fx(int x,int p)//求f(x)取模P的函数 { long long sum = 0; int i; for(i = n; i >= 0; i--) sum = (a[i] + sum * x ) % p; return (sum % p); } int main() { cin >> T; while(T--) { ncase++; memset(a,0,sizeof(a)); flag = 0; cin >> n; for(i = n; i >= 0; i--) cin >> a[i]; cin >> pri; for(j = 0; j < pri; j++) { if(fx(j,pri) == 0) for(i = j; i < pri * pri; i+=pri) { if(fx(i,pri * pri) == 0) { if(!flag) ans = i; flag++; } if(flag > 1) break; } } printf("Case #%d: ",ncase); if(!flag ) printf("No solution!\n"); else printf("%d\n",ans); } return 0 ; }