博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5451 Best Solver 数论 快速幂 2015沈阳icpc
阅读量:5757 次
发布时间:2019-06-18

本文共 2376 字,大约阅读时间需要 7 分钟。

Best Solver

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)

Total Submission(s): 1115    Accepted Submission(s): 645

Problem Description
The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart.
It is known that 
y=(5+26√)1+2x.
For a given integer x (0x<232) and a given prime number M (M46337), print [y]%M. ([y] means the integer part of y)
 

 

Input
An integer 
T (1<T1000), indicating there are T test cases.
Following are T lines, each containing two integers x and M, as introduced above.
 

 

Output
The output contains exactly 
T lines.
Each line contains an integer representing [y]%M.
 

 

Sample Input
7 0 46337 1 46337 3 46337 1 46337 21 46337 321 46337 4321 46337
 

 

Sample Output
Case #1: 97 Case #2: 969 Case #3: 16537 Case #4: 969 Case #5: 40453 Case #6: 10211 Case #7: 17947
 

 

Source
 

 

Recommend
wange2014
 

题目描述:

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

分析:

  这种(a+sqrt(b))^n%mod,向下取整取余的式子有个递推式   S(n) = 2*a*S(n-1)+(b-a*a)*S(n-2) 这个式子得到的结果是向上取整,我们这里是向下取整,所以最后得到的结果还要减一

  我这篇博客https://www.cnblogs.com/l609929321/p/9398349.html有这个递推式的推导过程

  由上诉递推式不难得到:S(n) = (10*S(n-1)-S(n-2)+mod)%mod

  但是这个题目的指数1+2^x(x<2^32)非常大,就算用矩阵快速幂也不行,所以我们得对式子进行一次优化

  看到指数很大的类似斐波拉数列问题(都是线性递推式)很容易的想到找循环节

  因为mod<=46337,所以我们直接遍历求前面46337项一定会出现循环节,然后记录下循环节的位置就好  

  (以后找模一个数的周期最大取到他的三倍,证明博客:https://www.xuebuyuan.com/1198038.html)

  再对指数按照循环节的位置进行取模就可以了

AC代码

#include #include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ls (r<<1)#define rs (r<<1|1)#define debug(a) cout << #a << " " << a << endlusing namespace std;typedef long long ll;const ll maxn = 1e5 + 10;const ll mod = 1e9 + 7;ll r[maxn], ans[maxn], x, m;ll qow( ll b, ll n, ll mod ) { ll ans = 1; while( n ) { if( n&1 ) { ans = ans*b%mod; } b = b*b%mod; n /= 2; } return ans;}int main() { ll T, t = 0; cin >> T; while( T -- ) { ll x, m; t ++; cin >> x >> m; ans[0] = 2, ans[1] = 10; for( ll 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] ) { //因为x很大,这里计算了循环周期 r[m] = i-1; break; } } ll k = (1+qow(2,x,r[m]))%r[m]; cout << "Case #" << t << ": " << (ans[k]-1+m)%m << endl; } return 0 ;}

  

转载于:https://www.cnblogs.com/l609929321/p/9398442.html

你可能感兴趣的文章
Apache Storm 官方文档 —— FAQ
查看>>
iOS 高性能异构滚动视图构建方案 —— LazyScrollView
查看>>
Java 重载、重写、构造函数详解
查看>>
【Best Practice】基于阿里云数加·StreamCompute快速构建网站日志实时分析大屏
查看>>
【云栖大会】探索商业升级之路
查看>>
HybridDB实例新购指南
查看>>
C语言及程序设计提高例程-35 使用指针操作二维数组
查看>>
华大基因BGI Online的云计算实践
查看>>
排序高级之交换排序_冒泡排序
查看>>
Cocos2d-x3.2 Ease加速度
查看>>
[EntLib]关于SR.Strings的使用办法[加了下载地址]
查看>>
中小型网站架构分析及优化
查看>>
写shell的事情
查看>>
负载均衡之Haproxy配置详解(及httpd配置)
查看>>
标准与扩展ACL 、 命名ACL 、 总结和答疑
查看>>
查找恶意的TOR中继节点
查看>>
MAVEN 属性定义与使用
查看>>
shell高级视频答学生while循环问题
查看>>
使用@media实现IE hack的方法
查看>>
《11招玩转网络安全》之第一招:Docker For Docker
查看>>