题目描述

小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题:

给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, …, N 顺序连接起来得到的数。例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题。

输入输出格式

输入格式:

从文件input.txt中读入数据,输入文件只有一行且为用空格隔开的两个正整数N和M,其中30%的数据满足1≤N≤1000000;100%的数据满足1≤N≤1018且1≤M≤109.

输出格式:

输出文件 output.txt 仅包含一个非负整数,表示 Concatenate (1 .. N) Mod M 的值。

输入输出样例

 输入样例#1:
13 13
 输出样例#1:
4
题解:
这道题如果不是要考虑每一次乘上的数是10的几次方的话,那便是裸的矩阵快速幂,但是加上的话也无非就是多分几种情况讨论罢了。
首先看递推式:f[i]=f[i-1]*10^k+i(可以看出只要对k讨论)
然后写出两个矩阵:{{0,1,1},{0,0,0},{0,0,0}}和{{k%m,0,0},{1,1,0},{0,1,1}};
快速幂即可。
代码如下:(注意每次循环的分类讨论)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
using namespace std;
typedef long long lol;
lol n,m,now,pre;
struct matrix
{lol a[3][3];matrix(){for(int i=0;i<3;i++)for(int j=0;j<3;j++)a[i][j]=0;}matrix(lol b[3][3]){for(int i=0;i<3;i++)for(int j=0;j<3;j++)a[i][j]=b[i][j];}friend matrix operator * (const matrix a,const matrix b){matrix ans;for(int i=0;i<3;i++)for(int j=0;j<3;j++)for(int k=0;k<3;k++)ans.a[i][j]=(ans.a[i][j]+(a.a[i][k]%m)*(b.a[k][j]%m)%m)%m;return ans;}
}S,T;
lol gi()
{lol ans=0,f=1;char i=getchar();while(i<'0'||i>'9'){if(i=='-')f=-1;i=getchar();}while(i>='0'&&i<='9'){ans=ans*10+i-'0';i=getchar();}return ans*f;
}
int main()
{lol i,j,k;n=gi();m=gi();lol s[3][3]={{0,1,1},{0,0,0},{0,0,0}};S=matrix(s);for(k=10;now<n;k*=10){lol t[3][3]={{k%m,0,0},{1,1,0},{0,1,1}};T=matrix(t);pre=min(k-1,n)-now;while(pre){if(pre&1)S=S*T;T=T*T;pre>>=1; }now=min(k-1,n);}printf("%lld\n",S.a[0][0]);return 0;
}

转载于:https://www.cnblogs.com/huangdalaofighting/p/7214691.html

[HNOI2011]数学作业相关推荐

  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]数学作业 分段矩阵乘法

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

  7. bzoj2326 [HNOI2011]数学作业

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

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

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

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

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

最新文章

  1. 美妆彩妆宣传PPT模板
  2. 如何使用 Python 操作 Git 代码?GitPython 入门介绍
  3. 城市是否可以坐车到达问题
  4. Some notes for CLFS2017
  5. Listener--------监听器
  6. 当推荐系统遇上图学习:基于图学习的推荐系统最新综述
  7. java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?
  8. python读取math_怎么使用python安装math库?怎么用?
  9. Android8.1 MTK平台 截屏功能分析
  10. 在ionic这个框架下(Angular JS),对URL进行重写,过滤掉URL中的#号
  11. Java:MySQL5.5安装教程
  12. leetcode之逆波兰表达式
  13. OpenCV-特征提取与检测(03、自定义角点检测器)
  14. 安装webpack和webpack打包(此文转自Henery)
  15. 第十二届全国计算机化学学术会议,中国化学会第十二届全国天然有机化学学术会议通知(第二轮)...
  16. 安卓bochs安装linux教程,Ubuntu 14.04 LTS 安装和配置Bochs
  17. 如何在Windows下安装ReviewBoard
  18. 微信小程序开发入门(API)
  19. java flag 用法_Java中一些常用的方法
  20. amazon.设计1. tic tac toe

热门文章

  1. python权限不够cmd安装不了_python环境配置+matplotlib
  2. 使用setCustomView建立标题居中的自定义ActionBar
  3. Bootstrap研究2-布局系统杂记
  4. PHP mysql_real_escape_string() 函数防止数据库攻击
  5. Spring Cloud Gateway 原理与应用场景
  6. Spring Boot 实现微信小程序订阅模板消息
  7. 服务器机械硬盘国产厂家,盘点服务器国产化呼声背后的优秀厂商
  8. SpringBoot整合kafka之kafka分区实战
  9. maven中的module及聚合项目
  10. POJ-1260 Pearls---DP