[luogu P3216] [HNOI2011]数学作业

题目描述

小 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

很显然,我们可以得到一个递推式:fn=10^len(n)*fn-1+n。然后看到范围那么大,而式子很简单,所以我们就将原式转为矩阵。

显然,根据原式,可以构造出如下矩阵:

{{fn}               {{10^len(n),1,1}                        {{fn-1}

{n}       =         {0,1,1}                    *                 {n-1}

{1}}                 {0,0,1}                                      {1}}

但是,我们发现,10^len(n)并不是一个常数。

怎么办?分段来求。1~9一段,10~99一段,100~999一段……10^k~n一段。

这样,就可以避免这一项会变化的情况了。

看起来非常的easy,是不是?写起来就不会这么觉得了。

特别是边界和细节,非常难以处理。调了整整2个多小时。。

code:

 #include<bits/stdc++.h>
 #define LL unsigned long long
 using namespace std;
 LL n,m,po[],lim[];
 struct Mat {
     LL a[][]; Mat() {memset(a,,sizeof a);}
 }tran,ans;
 void pre() {
     tran.a[][]=,tran.a[][]=;
     tran.a[][]=,tran.a[][]=,tran.a[][]=;
     tran.a[][]=,tran.a[][]=,tran.a[][]=;
     po[]=,po[]=; ; i<=; i++) po[i]=po[i-]*;
     lim[]=; ; i<=; i++) lim[i]=lim[i-]*; lim[]=;
     ans.a[][]=,ans.a[][]=,ans.a[][]=;
 }
 Mat Mul(Mat u,Mat v) {
     Mat w; int i,j,k;
     ; i<; i++)
         ; j<; j++)
             ; k<; k++)
                 (w.a[i][j]+=u.a[i][k]*v.a[k][j])%=m;
     return w;
 }
 Mat Qpow(Mat b,LL p) {
     ) return b;
     Mat t=Qpow(b,p/); t=Mul(t,t);
     ==?t:Mul(t,b);
 }
 int main() {
     cin>>n>>m,pre();
     ; i<=; i++) ]<=n) {
         tran.a[][]=po[i+]%m;
         &&lim[i]-<=n) ans=Mul(Qpow(tran,lim[i]-lim[i-]),ans);
         ]+),ans);
     }else break;
     cout<<ans.a[][]<<'\n';
     ;
 }

[luogu P3216] [HNOI2011]数学作业的更多相关文章

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

    P3216 [HNOI2011]数学作业 题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 NN 和 MM ,要求计算 Concatenate (1 .. N ...

  2. 洛谷P3216 [HNOI2011] 数学作业 [矩阵加速,数论]

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

  3. P3216 [HNOI2011]数学作业

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

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

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

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

    最近学了矩阵,kzj大佬推荐了我这一道题目. 乍一眼看上去,没看出是矩阵,就随便打了一个暴力,30分. 然后仔细分析了一波,发现蛮简单的. 结果全wa了,先看看下面的错误分析吧! 首先,设f[n]为最 ...

  6. [bzoj2326] [洛谷P3216] [HNOI2011] 数学作业

    想法 最初的想法就是记录当前 \(%m\) 值为cur,到下一个数时 \(cur=cur \times 10^x + i\) n这么大,那就矩阵乘法呗. 矩阵乘法使用的要点就是有一个转移矩阵会不停的用 ...

  7. bzoj2326: [HNOI2011]数学作业

    矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...

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

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

  9. [HNOI2011]数学作业 --- 矩阵优化

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

随机推荐

  1. win10 右键菜单很慢的解决方式

    本来想用 win7 的,不想花很多时间折腾了.现在新电脑主板硬盘CPU都在排挤 win7 ,真是可怜呀.正题: 新电脑的性能应该还算不错的, 18 年跑分 29w 以上,但在图标上面右键却都要转圈几秒 ...

  2. Codeforces Beta Round #65 (Div. 2) C. Round Table Knights

    http://codeforces.com/problemset/problem/71/C 题意: 在一个圆桌上有n个人,每个人要么是1,要么就是0,现在要判断是否能由一些1相连构成正多边形. 思路: ...

  3. 动态 hover 使用变相使用

    使用   onmouseover  和 onmouseout 代替 hover foreach (var menu in Model.OrderBy(x => x.Order).Where(x ...

  4. layui upload 后台获取不到值

    后台获取不到值方法一: <script> layui.use('upload', function () { var upload = layui.upload; //执行实例 var u ...

  5. 深入理解char * ,char ** ,char a[ ] ,char *a[]

    1.数组的本质 数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素. 2.指针 指针也是一种变量,只不过它的内存单元中保存的是一个标识其他位置的地址.由于地址也 ...

  6. React Native 异步存储

    异步存储 http://blog.csdn.net/yulianlin/article/details/52473456

  7. 动态LINQ(Lambda表达式)

    1.准备数据实体 public class Data { public string AccountNO { get; set; } public int Count { get; set; } } ...

  8. es6中export和export default的区别

    export与export default均可用于导出常量.函数.文件.模块 你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用 ...

  9. react点滴

    1.<SubSubComp {...this.props } /> 传递属性,{...props}的方式为组件传递了这两个属性,这就是JSX中的延展属性,"..."成为 ...

  10. mac软件

    1. http://www.ifunmac.com/ 2.Mac安装软件时提示已损坏的解决方法 http://www.jianshu.com/p/3d04a2292fcd 3.mac以后有时间在装的软 ...