Description

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

Input

只有一行且为用空格隔开的两个正整数N和M,
1≤N≤10^18且1≤M≤10^9.

Output

仅包含一个非负整数,表示 Concatenate (1 .. N) Mod M 的值。

Sample Input

13 13

Sample Output

4
思路: 分段做矩阵乘法
我们有
(f[n] n 1)=(f[n-1] n-1 1)* (10^k 0 0 
1     1 0
1    1 1 )
所以我们可以按照k分段,k表示数字的位数
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 #define F(i,a,b) for(int i=a;i<=b;i++)
 5 #define D(i,a,b) for(int i=a;i>=b;i--)
 6 #define ms(i,a)  memset(a,i,sizeof(a))
 7 #define LL       long long
 8 template<class T>void read(T &x){
 9     x=0; char c=getchar();
10     while (!isdigit(c)) c=getchar();
11     while (isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
12 }
13 template<class T>void write(T x){
14     if(x>9) write(x/10);
15     putchar(48+x%10);
16 }
17
18 LL n,m,pw[20],pwm[20];
19
20 struct Matrix{
21     int x[3][3];
22     Matrix operator *(Matrix const &t)const{
23         Matrix y; ms(0,y.x);
24         F(i,0,2)F(j,0,2)F(k,0,2) y.x[i][j]=(y.x[i][j]+(LL)x[i][k]*t.x[k][j]) % m;
25         return y;
26     }
27     Matrix operator^(LL k){
28         Matrix ans,tmp;
29         ms(0,ans.x);
30         F(i,0,2) F(j,0,2) tmp.x[i][j]=x[i][j];
31         F(i,0,2) ans.x[i][i]=1;
32         while (k){
33             if(k&1) ans=ans*tmp;
34             tmp=tmp*tmp;
35             k>>=1;
36         }
37         return ans;
38     }
39 };
40
41 int main(){
42     read(n);
43     read(m);
44     int len=0;
45     LL k=n;
46     while (k){
47         len++;
48         k/=10;
49     }
50     pw[0]=1;
51     pwm[0]=1%m;
52     F(i,1,19) pw[i]=pw[i-1]*10,pwm[i]=pwm[i-1]* 10% m;
53     LL ans=0;
54     F(i,1,len-1) {
55         Matrix t;
56         ms(0,t.x);
57         t.x[0][0]=pwm[i];
58         t.x[1][0]=t.x[1][1]=1;
59         t.x[2][0]=t.x[2][1]=t.x[2][2]=1;
60         t=t^(pw[i]-pw[i-1]);
61         ans=(ans*t.x[0][0]+(pwm[i-1]-1)*t.x[1][0]+t.x[2][0])% m;
62     }
63     Matrix t;
64     ms(0,t.x);
65     t.x[0][0]=pwm[len];
66     t.x[1][0]=t.x[1][1]=1;
67     t.x[2][0]=t.x[2][1]=t.x[2][2]=1;
68     t=t^(n-pw[len-1]+1);
69     ans=(ans*t.x[0][0]+(pwm[len-1]-1)*t.x[1][0]+t.x[2][0]) % m;
70     write(ans);
71     return 0;
72 }

转载于:https://www.cnblogs.com/ZJXXCN/p/9843501.html

bzoj 2326: [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. [HNOI2011]数学作业

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

  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. TensorRT优化方案图例
  2. 设计模式系列·抽象工厂模式
  3. Spring框架使用规范和IOC的开发
  4. 【MM配置】Movement Type 移动类型创建
  5. Dingo Api 入门
  6. linux函数的阻塞与非阻塞IO及错误处理
  7. 1024程序员节:除了高薪,你还有什么理由坚持做程序员?
  8. java生成json字符串,真香
  9. MSRA,我的实习初体验(下)
  10. 斯坦福大学吴恩达机器学习教程中文笔记——目录
  11. 秀米编辑器内容复制到wangEditor中图片的处理
  12. 网络渗透测试实验二(网络扫描与网络侦察)
  13. 不是科班出身可以做配音演员吗?成都环宇博睿告诉你有没有学历要求?
  14. 【云和恩墨大讲堂】高凯 | Oracle 12c 新特性-多租户的维护管理
  15. FigDraw 22. SCI文章中绘图之核密度及山峦图 (ggridges)
  16. java 函数表_C语言、Java语言的符号表区别和特点是什么?分别是如和处理函数参数的?...
  17. contentprovider踩坑之路之Failed to find provider info for com.example.app.provider和cursor=null空指针问题
  18. Python利用经纬度创建shpfile点图层并生成tif
  19. java实现简单的日历功能
  20. 微信小程序——好看的文字加输入框(文本框)

热门文章

  1. 通过form表单请求servlet资源代码
  2. Java NIO 选择器(Selector)的内部实现(poll epoll)
  3. 多线程端点服务发布程序(摘)
  4. 时间复杂度和空间复杂度3 - 数据结构和算法05
  5. (转载)为什么欧美拿金牌不感谢祖国
  6. 计算机科学 生物技术,计算机科学(Computer Science)简介
  7. 麻省理工学院计算机博士年薪,麻省理工学院计算机博士录取要求
  8. python深浅拷贝 面试_python基础-深浅拷贝
  9. r语言读取csv文件赋值gamma_tidyfst vs pandas(1):csv文件读写
  10. code vs 把所有行拼接成一行_关于SQL Server将一列的多行内容拼接成一行的问题讨论...