Hdu 5451 Best Solver (2015 ACM/ICPC Asia Regional Shenyang Online) 暴力找循环节 + 递推

题目链接:

  Hdu  5451  Best Solver

题目描述:

  对于,给出x和mod,求y向下取整后取余mod的值为多少?

解题思路:

  x的取值为[1, 232],看到这个指数,我的心情是异常崩溃的。(吐血。。。。。。) 可是仔细观察,它指数大,可是mod小啊,它吓人,可是可以暴力搞啊!!

  这个题目一个难点就是要向下取整求余,详解见传送门,本题是向下取整,也就是向上取整加一。

  还有就是指数太大,要找到循环节,其实由于mod小,循环节并没有太大,暴力跑就ok啦!

 此刻内心是崩溃的

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 typedef long long LL;
 8 const LL maxn = 47000;
 9 LL r[maxn], ans[maxn], x, m;
10 
11 LL Pow (LL a, LL n, LL mod)
12 {
13     LL res = 1;
14     while (n)
15     {
16         if (n % 2)
17             res = (res * a) % mod;
18         a =(a * a) % mod;
19         n /= 2;
20     }
21     return res;
22 }
23 
24 void init ()
25 {
26     ans[0] = 2;
27     ans[1] = 10;
28     for (int i=2; i<maxn; i++)
29     {
30         ans[i] = (10 * ans[i-1] - ans[i-2] + m) % m;
31         if (ans[i-1]==ans[0] && ans[i]==ans[1])
32         {
33             r[m] = i - 1;
34             return ;
35         }
36     }
37 }
38 
39 LL solve ()
40 {
41     init ();
42     LL k = (1 + Pow (2, x, r[m])) % r[m];
43     return (ans[k] - 1 + m) % m;
44 }
45 
46 int main ()
47 {
48     LL t;
49     scanf ("%lld", &t);
50     for (int i=1; i<=t; i++)
51     {
52         scanf ("%lld %lld", &x, &m);
53         printf("Case #%d: %lld
", i, solve ());
54     }
55     return 0;
56 }
本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/alihenaixiao/p/4830087.html