[HNOI2011]数学作业 题解
这道题看着挺难然而其实看破了也挺容易的。首先N极其的大,几乎要炸掉long long ,所以O(n)的算法一定是扑街了,身为一个脑残志坚的OIer,怎能不想到矩阵快速幂优化呢?
有趣的是这道题矩阵有很多种,Q某犇有另一种做法,大家也可以去他那看一看。
答案矩阵是这样的:
f[x] x+1 1
被我们用来求答案的矩阵长这样:
10^t 0 0
1 1 0
0 1 1
其中t随我们现在处理的数的位数而改变。
然后这道题就硬生生的被我们搞成了一个矩阵快速幂的裸题。只要注意矩阵乘不满足交换律就是了。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<map> 7 #include<queue> 8 #include<string> 9 #include<cmath> 10 using namespace std; 11 long long n,m; 12 struct no{ 13 long long x,y; 14 long long a[20][20]; 15 no operator *(const no &c){ 16 no b; 17 memset(b.a,0,sizeof(b.a)); 18 b.x=x; 19 b.y=y; 20 for(int i=1;i<=x;i++) 21 { 22 for(int j=1;j<=y;j++) 23 { 24 for(int k=1;k<=y;k++) 25 { 26 b.a[i][j]+=((a[i][k]%m)*(c.a[k][j]%m))%m; 27 b.a[i][j]%=m; 28 } 29 } 30 } 31 return b; 32 } 33 }; 34 no ksm(long long x,no a,no b){ 35 no ans=a; 36 while(x) 37 { 38 if((x&1)) ans=ans*b; 39 b=b*b; 40 x>>=1; 41 } 42 return ans; 43 } 44 long long get(long long x){ 45 long long now=1; 46 no ans,a; 47 memset(a.a,0,sizeof(a.a)); 48 a.x=a.y=3; 49 a.a[2][1]=a.a[2][2]=a.a[3][2]=a.a[3][3]=1; 50 memset(ans.a,0,sizeof(ans.a)); 51 ans.x=1,ans.y=3; 52 ans.a[1][1]=0; 53 ans.a[1][2]=ans.a[1][3]=1; 54 for(int i=1;;i++) 55 { 56 now*=10; 57 if(x>(now-1)) 58 { 59 a.a[1][1]=now; 60 ans=ksm(now-now/10,ans,a); 61 } 62 else 63 { 64 a.a[1][1]=now; 65 ans=ksm(x-(now/10-1),ans,a); 66 break; 67 } 68 } 69 return ans.a[1][1]; 70 } 71 int main(){ 72 scanf("%lld%lld",&n,&m); 73 printf("%lld\n",get(n)); 74 //while(1); 75 return 0; 76 }
View Code
转载于:https://www.cnblogs.com/liutianrui/p/7360281.html
[HNOI2011]数学作业 题解相关推荐
- 洛谷 P3216 [HNOI2011]数学作业
PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P3216 [HNOI2011]数学作业 题目 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正 ...
- BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )
BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...
- bzoj 2326: [HNOI2011]数学作业(矩阵快速幂)
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2249 Solved: 1301 [Submit][St ...
- HNOI2011 数学作业
先上一下题目吧 HNOI2011 数学作业 Problem 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算 Concatenate(1..N) ...
- [HNOI2011]数学作业
题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...
- bzoj 2326: [HNOI2011]数学作业
Description 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:给定正整数 N 和 M 要求计算 Concatenate (1 .. N) Mod M 的值,其中 Conc ...
- BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】
题解 我们设f[i]表示前i个数模M意义下的答案 则f[i] = f[i - 1] * 100...0 + i[i是几位就有几个0] 可以写出矩阵递推式: 之后按位数分组矩乘就好了 #include& ...
- 【bzoj2326】[HNOI2011]数学作业 矩阵乘法
题目描述 题解 矩阵乘法 考虑把相同位数的数放到一起处理: 设有$k$位的数为$[l,r]$,那么枚举从大到小的第$i$个数(即枚举$r-i+1$),考虑其对$Concatenate(l..r)$的贡 ...
- [HNOI2011]数学作业 分段矩阵乘法
给n,问123--n这个数字串模m的数值,n<=1e18 对于0-9,10-99,这些数字之间都满足f(n)=f(n-1)*10^c,c定值 这每一段都可以做矩阵快速幂 ,存一下[f(n),n, ...
最新文章
- reactnative 获取定位_react native 获取地理位置的方法示例
- VC2008下编译使用OpenSSL
- Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
- 版本名称GA的含义:SNAPSHOT-alpha-beta-release-GA
- Jerry的ABAP, Java和JavaScript乱炖
- centos6.6 源码安装mysql5.5_CentOS6.x下源码安装MySQL5.5
- python+selenium+unittest测试框架1-unittest单元测试框架和断言
- js中数字直接点方法会报错,如1.toString()
- ssas还原数据库_SSAS数据库管理
- shell脚本监控cpu/内存使用率 转
- HDU2523 SORT AGAIN【计数排序】
- django models 配置
- Windows驱动开发技术详解——经典书评
- 简练软考知识点整理-管理沟通
- 关于document.cookie的使用javascript
- laxTex 手写体
- 唯美毕业论文答辩PPT模板
- java实现交集并集差集
- 如何用foobar200转换无损wma!
- 第五章 黎明踏浪号 Facebook (一)