HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)

Problem Description
  Let f(x) = anxn +...+ a1x +a0, in which ai (0 <= i <= n) are all known integers. We call f(x) 0 (mod m) congruence equation. If m is a composite, we can factor m into powers of primes and solve every such single equation after which we merge them using the Chinese Reminder Theorem. In this problem, you are asked to solve a much simpler version of such equations, with m to be prime's square.
 
Input
  The first line is the number of equations T, T<=50.
  Then comes T lines, each line starts with an integer deg (1<=deg<=4), meaning that f(x)'s degree is deg. Then follows deg integers, representing an to a0 (0 < abs(an) <= 100; abs(ai) <= 10000 when deg >= 3, otherwise abs(ai) <= 100000000, i<n). The last integer is prime pri (pri<=10000). 
  Remember, your task is to solve f(x) 0 (mod pri*pri)
 
Output
  For each equation f(x) 0 (mod pri*pri), first output the case number, then output anyone of x if there are many x fitting the equation, else output "No solution!"
 
题目大意:给你一个最高4次幂的多项式,求一个x,满足f(x) mod phi² = 0。
思路:先枚举x = [0, phi),如果f(x) mod phi = 0,再枚举x2 = x,每次加phi,直到f(x) mod phi² = 0,输出结果。找不到输出No solution。
PS:我也不知道为什么是对的我看别人说是这么做的……我数论知识很少……我只知道要满足f(x) mod phi² = 0就要先满足f(x) mod phi = 0……
 
代码(62MS):
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 typedef long long LL;
 7 
 8 const int MAXN = 8;
 9 
10 int T, deg;
11 LL phi;
12 LL a[MAXN];
13 
14 LL f(LL x, LL m) {
15     LL ret = 0, xx = 1;
16     for(int i = 0; i <= deg; ++i) {
17         ret = (ret + a[i] * xx) % m;
18         xx = (xx * x) % m;
19     }
20     return ret;
21 }
22 
23 LL ans, ret;
24 int t;
25 
26 void solve() {
27     for(ans = 0; ans < phi; ++ans) {
28         if(f(ans, phi) == 0) {
29             for(ret = ans; ret <= phi * phi; ret += phi)
30                 if(f(ret, phi * phi) == 0) {
31                     printf("Case #%d: %d\n", t, (int)ret);
32                     return ;
33                 }
34         }
35     }
36     printf("Case #%d: No solution!\n", t);
37 }
38 
39 int main() {
40     cin>>T;
41     for(t = 1; t <= T; ++t) {
42         cin>>deg;
43         for(int i = deg; i >= 0; --i) cin>>a[i];
44         cin>>phi;
45         solve();
46     }
47 }
View Code

 

posted @ 2013-08-22 14:25  Oyking  阅读(451)  评论(5编辑  收藏  举报