HDU4569 Special equations

Posted BBBob

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU4569 Special equations相关的知识,希望对你有一定的参考价值。

 1 /*
 2  HDU4569 Special equations
 3  http://acm.hdu.edu.cn/showproblem.php?pid=4569
 4  数论 
 5  题意:f(x)为一n次方程求是否存在x, s.t. f(x)=0 (mod p^2)
 6  其中p为质数
 7  首先,我们只需考虑0-p中的x即可,因为其他的x总可以先取模
 8  到这个区间,因此可以在1e4内找到f(x)=0(mod p)的x
 9  考虑到 x=0(mod p^2) => x=0(mod p) 
10  因此只需在这些x中找是否满足x=0(mod p^2)即可
11  当我们找到一个满足x0=0(mod p)的x0时,
12  就的到了通解x=x0+k*p;在通解中找满足题意的x即可
13  */
14 #include <cstdio>
15 #include <algorithm>
16 #include <cstring>
17 #include <cmath>
18 #include <vector>
19 #include <queue>
20 #include <iostream>
21 #include <map>
22 #include <set>
23 //#define test
24 using namespace std;
25 const int Nmax=1005;
26 long long m;
27 long long num[15];
28 long long n;
29 long long fac(long long x,long long mod)
30 {
31     long long ans=0LL;
32     long long base=1LL;
33     x=x%mod;
34     for(int i=0;i<=n;i++)
35     {
36         ans=(ans+((num[i]*base)%mod))%mod;
37         base=(base*x)%mod;
38     }
39     ans=ans%mod;
40     while(ans<0)
41         ans+=mod;
42     return ans;
43 }
44 long long ans;
45 int is()
46 {
47     for(long long i=0LL;i<=m;i++)
48     {
49         //if(i==9716LL)
50             //printf("YES,%lld\n",fac(i,m*m));
51         if(!fac(i,m))
52         {
53             //printf("fac(i,m*m):%lld\n",fac(i,m*m));
54             for(long long j=0LL;j<=m;j++)
55             {
56                 if(!fac(i+j*m,m*m))
57                 {
58                     ans=i+j*m;
59                     return 1;
60                 }
61             }
62             return 0;
63         }
64     }
65     return 0;
66 }
67 int main()
68 {
69     #ifdef test
70     freopen("test.in","r",stdin);
71     #endif
72     int t; 
73     //long long a=935124339326LL;
74     //a=-a;
75     //printf("%lld\n",a%(9811LL);
76     scanf("%d",&t);
77     for(int ttt=1;ttt<=t;ttt++)
78     {
79         scanf("%lld",&n);
80         for(int i=n;i>=0;i--)
81             scanf("%lld",&num[i]);
82         scanf("%lld",&m);
83         printf("Case #%d: ",ttt);
84         if(is())
85             printf("%lld\n",ans);
86         else
87             printf("No solution!\n");
88     }
89     return 0;
90 }

 

以上是关于HDU4569 Special equations的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1496 Equations

hdu 5937 -- Equation(搜索)

HDU 1840 Equations (简单数学 + 水题)(Java版)

HDU 2199 Can you solve this equation?(二分搜索)

HDU 5937 Equation

HDU 2199 Can you solve this equation?(二分精度)