HDU 4569 Special equations (数学题)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4569


题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0.

题解:f(x)%(p*p)=0那么一定有f(x)%p=0,f(x)%p=0那么一定有f(x+p)%p=0。

所以我们可以开始从0到p枚举x,当f(x)%p=0,然后再从x到p*p枚举,不过每次都是+p,找到了输出即可,没有的话No solution!


AC代码:

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std;

typedef __int64 LL;
const int N=1;
const LL mod=1000000007LL;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);

LL xi[6],p2,p;
int n;

LL ff(LL x,LL k)
{
    LL sum=0,ans=1;
    for(int i=0;i<=n;i++)
    {
        sum=(sum+xi[i]*ans)%k;
        ans*=x;
    }
    return (sum+k)%k;
}

void xiaohao()
{
    LL i,x,x2;
    for(x=0;x<p;x++)
    {
        LL t=ff(x,p);
        if(t%p==0)
        {
            for(x2=x;x2<p2;x2+=p)
            {
                LL t2=ff(x2,p2);
                if(t2%p2==0)
                {
                    printf("%I64d\n",x2);
                    return ;
                }
            }
        }
    }
    printf("No solution!\n");
}

int main()
{
    int i,j,T,ca=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=n;i>=0;i--)
            scanf("%I64d",&xi[i]);
        scanf("%I64d",&p);
        p2=p*p;
        printf("Case #%d: ",++ca);
        xiaohao();
    }
    return 0;
}


 

 

posted on 2013-08-14 18:59  you Richer  阅读(431)  评论(0编辑  收藏  举报