这道题看着挺难然而其实看破了也挺容易的。首先N极其的大,几乎要炸掉long long ,所以O(n)的算法一定是扑街了,身为一个脑残志坚的OIer,怎能不想到矩阵快速幂优化呢?

  有趣的是这道题矩阵有很多种,Q某犇有另一种做法,大家也可以去他那看一看。

  答案矩阵是这样的:

    f[x]   x+1   1

  被我们用来求答案的矩阵长这样:

    10^t     0      0

    1         1      0

    0         1      1

   其中t随我们现在处理的数的位数而改变。

  然后这道题就硬生生的被我们搞成了一个矩阵快速幂的裸题。只要注意矩阵乘不满足交换律就是了。

  

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
long long n,m;
struct no{
long long x,y;
long long a[][];
no operator *(const no &c){
no b;
memset(b.a,,sizeof(b.a));
b.x=x;
b.y=y;
for(int i=;i<=x;i++)
{
for(int j=;j<=y;j++)
{
for(int k=;k<=y;k++)
{
b.a[i][j]+=((a[i][k]%m)*(c.a[k][j]%m))%m;
b.a[i][j]%=m;
}
}
}
return b;
}
};
no ksm(long long x,no a,no b){
no ans=a;
while(x)
{
if((x&)) ans=ans*b;
b=b*b;
x>>=;
}
return ans;
}
long long get(long long x){
long long now=;
no ans,a;
memset(a.a,,sizeof(a.a));
a.x=a.y=;
a.a[][]=a.a[][]=a.a[][]=a.a[][]=;
memset(ans.a,,sizeof(ans.a));
ans.x=,ans.y=;
ans.a[][]=;
ans.a[][]=ans.a[][]=;
for(int i=;;i++)
{
now*=;
if(x>(now-))
{
a.a[][]=now;
ans=ksm(now-now/,ans,a);
}
else
{
a.a[][]=now;
ans=ksm(x-(now/-),ans,a);
break;
}
}
return ans.a[][];
}
int main(){
scanf("%lld%lld",&n,&m);
printf("%lld\n",get(n));
//while(1);
return ;
}

[HNOI2011]数学作业 题解的更多相关文章

  1. bzoj2326: [HNOI2011]数学作业

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

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

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

  3. [luogu P3216] [HNOI2011]数学作业

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

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

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

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

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

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

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

  7. 【HNOI2011】数学作业 题解(递推+矩阵快速幂)

    题目链接 题目大意:求$1-n$所拼接起来的数$mod\ m$的值. ----------------------------------- 递推式子很好想:$f_i=f_{i-1}*10^{\lg ...

  8. [HNOI2011]数学作业

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

  9. P3216 [HNOI2011]数学作业

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

随机推荐

  1. 【图文教程】de4dot实战字符串解密(演示:hishop微分销系统)

    原文:[图文教程]de4dot实战字符串解密(演示:hishop微分销系统) 前些日子,公司需求开发一个微分销系统,于是找来hishop微分销系统想借鉴一下,没想到里面各种加密,就连字符串也都加密了. ...

  2. wcf服务端代码方式及客户端代码方式

    ServiceHost  host;  // 全局 host = new ServiceHost(typeof(实现服务接口的类)); host.open(); 用代码配置端点的方法 host.add ...

  3. UWP使用AppService向另一个UWP客户端应用程序提供服务

    原文:UWP使用AppService向另一个UWP客户端应用程序提供服务 在上篇里,我使用的是寄宿在WPF上的WCF进行两个程序间的通信,在解决问题的同时,我的同事也在思考能否使用UWP来做这件事.于 ...

  4. 基于EF6的快速开发Web框架——Swift.Net

    Swift.Net This Is A Light-Weight And Fast-Develop .Net Framework. Usage STEP 1 Create Your Entities ...

  5. ToolBarTray与ToolBarPanel的区别

    ToolBarTray 类:表示处理ToolBar 的布局的容器.用于ToolBar控件模板之中. e.g. <ToolBarTray> <ToolBar> <Butto ...

  6. 毕设(二)C#SerialPort

    毕业设计中,用到串口与无人机通信,所以就用到了SerialPort这个类,这个类在设置属性时, 用到最主要的属性应该是COM口和波特率,由于本人不熟悉硬件,不便多说,但经验告诉我是这样的, 还有数据位 ...

  7. Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

    When compiling Qt you can choose one of these options based on the configure command line: no OpenSS ...

  8. QThread的源码(直接搜索"thread.cpp"即可,或者在github里搜)

    void QThread::run() { (void) exec(); } int QThread::exec() { Q_D(QThread); QMutexLocker locker(& ...

  9. DataVeryLite和Nhibernate性能对比

    电脑型号:acer 4752g 电脑配置: 代码分享: class Program { static void Main(string[] args) { Debug.Listeners.Add(ne ...

  10. 《C++ Primer》读书笔记 第二章

    1.在算数表达式中最好不要使用char或bool,只有在存放字符或布尔值时才使用他们,因为char在有些机器上是有符号的,在一些机器上是无符号的,所以特别容易出问题,如果只表示一个不大的整数,那么明确 ...