您的位置:首页 > 其它

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

2015-09-22 19:30 295 查看
题目链接:

  Hdu 5451 Best Solver

题目描述:

  对于

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

解题思路:

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

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

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


此刻内心是崩溃的

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long LL;
const LL maxn = 47000;
LL r[maxn], ans[maxn], x, m;

LL Pow (LL a, LL n, LL mod)
{
LL res = 1;
while (n)
{
if (n % 2)
res = (res * a) % mod;
a =(a * a) % mod;
n /= 2;
}
return res;
}

void init ()
{
ans[0] = 2;
ans[1] = 10;
for (int i=2; i<maxn; i++)
{
ans[i] = (10 * ans[i-1] - ans[i-2] + m) % m;
if (ans[i-1]==ans[0] && ans[i]==ans[1])
{
r[m] = i - 1;
return ;
}
}
}

LL solve ()
{
init ();
LL k = (1 + Pow (2, x, r[m])) % r[m];
return (ans[k] - 1 + m) % m;
}

int main ()
{
LL t;
scanf ("%lld", &t);
for (int i=1; i<=t; i++)
{
scanf ("%lld %lld", &x, &m);
printf("Case #%d: %lld\n", i, solve ());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: