HDU - 5451 Best Solver(循环群+矩阵快速幂)
题目链接:点击查看
题目大意:给定x和M,已知
求%M
题目解析:这种公式题在之前已经证明过做法,详见:点击查看
这道题与hdu4565的不同之处就是,这里的n=给的特别的大,而且M不确定,所以没法用费马小定理降幂去做
但从网上看大牛的解析知道,原来这个题是有循环群的,只要先找到()的一个循环群,就可以将()变到可以处理的范
围内了,剩下的做法就和hdu4565一个样了
对了记得最后结果需要减一,因为这个题要求的是y的整数部分,还是需要注意一下负数取模的情况
上代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2;LL mod;struct M
{LL a[N][N];
};M operator*(M a,M b)
{M temp;memset(temp.a,0,sizeof(temp.a));for(LL i=0;i<N;i++)for(LL j=0;j<N;j++){temp.a[i][j]=0;for(LL k=0;k<N;k++){temp.a[i][j]=(temp.a[i][j]+((a.a[i][k]*b.a[k][j])%mod+mod)%mod)%mod;}}return temp;
} M q_pow(M a,LL n)
{M ans;memset(ans.a,0,sizeof(ans.a));for(LL i=0;i<N;i++)ans.a[i][i]=1;while(n){if(n&1)ans=ans*a;a=a*a;n>>=1;}return ans;
}int q_pow(LL a,LL b,LL mod)
{LL ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans;
}int MOD[46337+100];int cir[46337+100];void find(int mod)//找到循环节
{cir[0]=2;cir[1]=10;for(int i=2;;i++){cir[i]=((10*cir[i-1]-cir[i-2]+mod)%mod+mod)%mod;if(cir[i]==cir[1]&&cir[i-1]==cir[0]){MOD[mod]=i-1;break;}}return;
}int main()
{
// freopen("input.txt","r",stdin);LL n;int w;cin>>w;int kase=0;memset(MOD,0,sizeof(MOD));while(w--){LL x,m;scanf("%lld%lld",&x,&m);mod=m;if(!MOD[m])find(m);mod=m;
// cout<<MOD[m]<<endl;n=(q_pow(2,x,MOD[m])+1)%MOD[m];if(n==1){cout<<10%m<<endl;continue;}M start;start.a[1][1]=0;start.a[0][0]=10;start.a[1][0]=-1;start.a[0][1]=1;M ans;memset(ans.a,0,sizeof(ans.a));ans.a[0][0]=10;ans.a[0][1]=2;M res=q_pow(start,n-1);printf("Case #%d: %lld\n",++kase,(((ans*res).a[0][0]+mod)%mod-1+mod)%mod);
/* M temp=q_pow(start,2);temp=ans*temp;for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<temp.a[i][j]<<' ';cout<<endl;}*/}return 0;
}
HDU - 5451 Best Solver(循环群+矩阵快速幂)相关推荐
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x 求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...
- HDU - 4686 Arc of Dream(矩阵快速幂,水题)
题目链接:点击查看 题目大意:给出定义: 现在依次给出n,A0,AX,AY,B0,BX,BY 求Aod的第n项对1e9+7取模后的结果 题目分析: 简单矩阵快速幂 首先化简一下: 初始矩阵:(取n=1 ...
- HDU 5950 Recursive sequence(矩阵快速幂)
题目链接:Recursive sequence 题意:给出前两项和递推式,求第n项的值. 题解:递推式为:$F[i]=F[i-1]+2*f[i-2]+i^4$ 主要问题是$i^4$处理,容易想到用矩阵 ...
- HDU - 5411 CRB and Puzzle 矩阵快速幂
HDU - 5411 考虑直接dp会T, 用矩阵优化一下就好了. #include<bits/stdc++.h> #define LL long long #define LD long ...
- HDU 4291 A Short problem 矩阵快速幂 循环节
题解思路: 构造矩阵,矩阵乘法计算还是t; 需要找循环节; (注意因为是复合函数,不可以在里面取mod) 暴力跑只有可以找到g(222222224)%1e9==g(0)%1e9; 所以 g(g(n ...
- 【HDU - 6185】Covering(矩阵快速幂优化二维dp,高斯消元,轮廓线dp打表)
题干: Bob's school has a big playground, boys and girls always play games here after school. To protec ...
- HDU 6185 Covering 矩阵快速幂 递推
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6185 题目描述: 一个4*n的矩形, 你用1*2的矩形覆盖有多少种方案, n <= 1e18 ...
- 【HDU - 4990】 Reading comprehension (构造+矩阵快速幂)
题干: Read the program below carefully then answer the question. #pragma comment(linker, "/STACK ...
- HDU 1757 A Simple Math Problem(矩阵快速幂)
题目链接 题意 :给你m和k, 让你求f(k)%m.如果k<10,f(k) = k,否则 f(k) = a0 * f(k-1) + a1 * f(k-2) + a2 * f(k-3) + -- ...
最新文章
- labview简易计算机实验报告,labview实验报告..doc
- 剑指offer:面试题17. 打印从1到最大的n位数
- ASP.NET中数据库数据导入Excel并打印
- [云炬创业管理笔记]第三章打造优秀创业团队讨论1
- boost::test模块测试树管理单元测试
- Xilinx视频加速技术专场
- 数据科学 python_为什么需要以数据科学家的身份学习Python的7大理由
- mysql存储过程实验几轮_想问下数据库中有关存储过程的实验,求大神!
- Access、CorelDRAW总结
- 【路径规划】基于matlab粒子群融合遗传算法栅格地图路径规划【含Matlab源码 526期】
- 计算机精品学习资料大放送
- 注册表清理软件测试自学,注册表检测及修复工具(RegClean Pro)
- python网络爬虫实战解析
- 西瓜书重温(七): 贝叶斯分类器(手推+代码demo)
- 机械工程c语言第一学期考试题,科学出版社机械工程图学习题集1~10章答案.ppt
- ClickHouse SAMPLE 采样子句介绍
- 【暴力破解】medusacrowbar工具
- 2018 Android面经分享(京东,百度,陌陌,58到家等知名公司)
- 2022-2027年中国闪速存储器集成电路行业市场深度分析及发展战略规划报告
- win10安装提示“我们无法创建新的分区”