题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2326   设f[i]表示i的答案,那么 f[i] = f[i - 1] * 10 + i      (i < 10) f[i] = f[i - 1] * 100 + i    (  100<=i<=999) ……   我们发现N的范围很大所以要用矩阵加速递推: 然后也需要分段改变递推矩阵的系数。


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)>>1)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;typedef long long LL;LL n, m;
const int MAX = 5;
struct Mat{int row, col;LL mat[MAX][MAX];
};
//initialize square matrix to unit matrix
Mat unit(int n){Mat A;A.row = A.col = n;memset(A.mat, 0, sizeof(A.mat));for (int i = 0; i < n; i ++)A.mat[i][i] = 1;return A;
}
//return A*B%mod
Mat mul(Mat A, Mat B, int mod){Mat C;C.row = A.row;C.col = B.col;for (int i = 0; i < A.row; i ++){for (int j = 0; j < B.col; j ++){C.mat[i][j] = 0;for (int k = 0; k < A.col; k ++)//注意这里要保证乘法不溢出,否则还需要设计特殊的乘法模C.mat[i][j] += A.mat[i][k] * B.mat[k][j];C.mat[i][j] %= mod;}}return C;
};
//return A^n%mod
Mat exp_mod(Mat A, LL n, int mod){Mat res = unit(A.row);while(n){if (n & 1LL){res = mul(res, A, mod);}A = mul(A, A, mod);n >>= 1;}return res;
}
Mat A, res;void changeA(LL p){A.col = A.row = 3;A.mat[0][0] = p % m;   A.mat[0][1] = 1;    A.mat[0][2] = 0;A.mat[1][0] = 0;    A.mat[1][1] = 1;    A.mat[1][2] = 1;A.mat[2][0] = 0;    A.mat[2][1] = 0;    A.mat[2][2] = 1;
}void init(){res.col = 1;res.row = 3;res.mat[0][0] = 0;res.mat[1][0] = 1;res.mat[2][0] = 1;changeA(10);
}int main(){cin >> n >> m;init();LL k1 = 0;LL k2 = 9;LL ct = 10;while(n >= k2){res = mul(exp_mod(A, k2-k1, m), res, m);k1 = k2;if (k2 == 99999999999999999)k2 = 100000000000000001;k2 = k2 * 10 + 9;changeA(10*ct);ct *= 10;}if (n > k1)res = mul(exp_mod(A, n-k1, m), res, m);cout << res.mat[0][0] << endl;return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2013/04/02/4114231.html

【HNOI2011】数学作业(BZOJ 2326)相关推荐

  1. BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )

    BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...

  2. bzoj 2326: [HNOI2011]数学作业(矩阵快速幂)

    2326: [HNOI2011]数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2249  Solved: 1301 [Submit][St ...

  3. 洛谷 P3216 [HNOI2011]数学作业

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P3216 [HNOI2011]数学作业 题目 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正 ...

  4. HNOI2011 数学作业

    先上一下题目吧 HNOI2011 数学作业 Problem 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算 Concatenate(1..N) ...

  5. bzoj 2326: [HNOI2011]数学作业

    Description 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:给定正整数 N 和 M 要求计算 Concatenate (1 .. N) Mod M 的值,其中 Conc ...

  6. [HNOI2011]数学作业

    题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenat ...

  7. [HNOI2011]数学作业 分段矩阵乘法

    给n,问123--n这个数字串模m的数值,n<=1e18 对于0-9,10-99,这些数字之间都满足f(n)=f(n-1)*10^c,c定值 这每一段都可以做矩阵快速幂 ,存一下[f(n),n, ...

  8. bzoj2326 [HNOI2011]数学作业

    矩阵乘,按位搞 两个矩阵,分别为 ans00i00100 10k11011001 快速幂转移就好了 #include <cstdio> #include <cstring> # ...

  9. BZOJ2326 [HNOI2011]数学作业 【矩阵快速幂】

    题解 我们设f[i]表示前i个数模M意义下的答案 则f[i] = f[i - 1] * 100...0 + i[i是几位就有几个0] 可以写出矩阵递推式: 之后按位数分组矩乘就好了 #include& ...

  10. [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)

    Description Input Output Sample Input Sample Output HINT Source Solution 递推式长这样:$f[n]=f[n-1]*10^k+n$ ...

最新文章

  1. C++:多线程中的小白(1)基础概念
  2. linux mysql root修复_linux下误删mysql的root用户,解决方法
  3. python图片识别-python图像识别
  4. docker centos7_centos7-yum部署docker
  5. flume案例-网络数据采集-启动flume
  6. c语言经典编程案例猜数字,用c语言编程猜数字
  7. [渝粤教育] 西南科技大学 动态网页设计(JSP) 在线考试复习资料
  8. 构造函数后面的冒号后初始化列表
  9. 汇编入门之输入、输出、奇偶判断、多字节变量定义
  10. 人工智能(AI)真正的价值究竟何在?
  11. 关于笔记本品牌的笑话!
  12. 反转链表与分组反转链表
  13. pythonyield详解_yield详解
  14. 用VC++自制王码五笔输入法安装包(转)
  15. Bootstrap---dateTimePicker时间控件配置与应用
  16. 记一次高德地图引入 AMap is not defined 血坑
  17. 查杀病毒实战----------------》ddg.223 and AnXQV
  18. 深度学习环境配置避坑-CUDA11.0+DGL1.8
  19. java、vue实现微信网页分享
  20. 2022年中国版权保护中心计算机软件著作权登记最全申请步骤流程

热门文章

  1. 公司前台打印机的连接方法(超级简单)
  2. Windows API之WriteFile函数详细解答
  3. html实现照片添加功能,HTML5 Canvas调用手机拍照功能实现图片上传功能(图文详解上篇)...
  4. 粒子系统模拟-计算机图形学 豆瓣,基于粒子系统的瀑布模拟与实现
  5. python turtle怎么用变量_Python Turtle绘图指定变量时出现问题
  6. mat opencv 修改roi_OpenCV中如何提取不规则ROI区域
  7. ant 改变表格数据_学不会这几个操作,面试时千万别说自己精通数据分析
  8. 启动未初始化小应用程序_SpringBoot详细打印启动时异常堆栈信息
  9. java一句话木马连接_webshell一句话木马大全
  10. 三支一扶计算机公共基础知识,三支一扶公共基础知识教材(精华版).doc