Special equations
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
Let f(x) = a nx n +...+ a 1x +a 0, in which a i (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 a n to a 0 (0 < abs(a n) <= 100; abs(a i) <= 10000 when deg >= 3, otherwise abs(a i) <= 100000000, i<n). The last integer is prime pri (pri<=10000).
Remember, your task is to solve f(x) 0 (mod pri*pri)
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 a n to a 0 (0 < abs(a n) <= 100; abs(a i) <= 10000 when deg >= 3, otherwise abs(a i) <= 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!"
Sample Input
4
2 1 1 -5 7
1 5 -2995 9929
2 1 -96255532 8930 9811
4 14 5458 7754 4946 -2210 9601
Sample Output
Case #1: No solution!
Case #2: 599
Case #3: 96255626
Case #4: No solution!
Case #2: 599
Case #3: 96255626
Case #4: No solution!
-------------------------------------------------------
题意:给你函数 f(x)
最多N就4位,输入任意一个x使f(x)%(prime*prime)=0。
首先要找一个 f(x) % prime = 0 ,只有满足这个条件 f(x) % (prime * prime) 才有可能等于0,对于f(x) % prime,可以枚举 0 - prime,如果满足条件那么在判断( x + prime * k ) % (prime * prime)是否满足条件
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
LL a[], P;
int deg;
bool func(LL x, LL mod)
{
LL res = , now = ;
for (int i = ; i <= deg; i++)
{
res = (res + now * a[i]) % mod;
now = (now * x) % mod;
}
if (res % mod)
return ;
return ;
}
int main()
{
int test;
scanf("%d", &test);
for (int t = ; t <= test; t++)
{
scanf("%d", °);
for (int i = deg; i >= ; i--)
{
scanf("%I64d", &a[i]);
}
scanf("%I64d", &P);
LL ans = -;
int flag = false;
for (LL i = ; i <= P; i++)
{
if (func(i, P))
continue;
for (LL j = i; j <= P * P; j += P)
{
if (func(j, P * P))
continue;
flag = true;
ans = j;
break;
}
if (flag)
break;
}
printf("Case #%d: ", t);
if (flag)
printf("%I64d\n", ans);
else
printf("No solution!\n");
}
return ;
}