矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!!

其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]*w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式,然后按每一位分别矩阵快速幂即可

矩阵:

f[i-1] w[i] 1 1 f[i]

i-1 * 0 1 1 = i

1 0 0 1 1

#include<iostream>
#include<cstdio>
using namespace std;
long long n,mod,t;
long long mul(long long a,long long b)
{
long long r=0;
while(b)
{
if(b&1)
r=(r+a)%mod;
a=(a<<1)%mod;
b>>=1;
}
return r;
}
struct qwe
{
long long a[5][5];
qwe operator * (const qwe &b) const
{
qwe c;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
{
c.a[i][j]=0;
for(int k=1;k<=3;k++)
c.a[i][j]=(c.a[i][j]+mul(a[i][k],b.a[k][j]))%mod;
}
return c;
}
}r;
void wk(long long t,long long la)
{
long long b=la-t/10+1;//cerr<<b<<endl;
qwe a;
a.a[1][1]=t,a.a[1][2]=1,a.a[1][3]=1;
a.a[2][1]=0,a.a[2][2]=1,a.a[2][3]=1;
a.a[3][1]=0,a.a[3][2]=0,a.a[3][3]=1;
while(b)
{
if(b&1)
r=a*r;
a=a*a;
b>>=1;
}
}
int main()
{
scanf("%lld%lld",&n,&mod);
r.a[1][1]=r.a[2][2]=r.a[3][3]=1;
for(t=10;t<=n;)
wk(t,t-1),t*=10ll;
wk(t,n);
printf("%lld\n",r.a[1][3]);
return 0;
}

最新文章

  1. 1280*720P和1920*1080P的视频在25帧30帧50帧60帧时的参数
  2. 最好的cpm广告联盟哪里有
  3. POJ 2828 Buy Tickets(线段树 树状数组/单点更新)
  4. 64位python安装MySQL-python 1.2.5
  5. Visual Studio 2013 各版本注册码
  6. extjs动态树 动态grid 动态列
  7. Linux系统下查看USB设备名及使用USB设备
  8. RxJava 教程-1 简介 原理 线程控制 变换
  9. C语言::模拟实现strlen函数
  10. word2vec 在 非 自然语言处理 (NLP) 领域的应用
  11. FusionWidgets Cylinder图
  12. Jenkins时区设置为北京时间
  13. Spring Security(十二):5. Java Configuration
  14. VM VirtualBox – Cannot register the hard disk
  15. logstash 5.1.1 学习
  16. 清除float的方法
  17. 【AtCoder】ARC096(C - F)
  18. postgres10.2时区研究
  19. PAT L1-032 Left-pad
  20. 使用System.getProperty方法,如何配置JVM系统属性 (转载)

热门文章

  1. React学习及实例开发(一)——开始
  2. Eddy&#39;s AC难题--hdu2200(递推)
  3. CodeForces 429B【dp】
  4. POJ 2513 【字典树】【欧拉回路】
  5. Spring中使用byType实现Beans自动装配
  6. OPENWRT安装Python到U盘
  7. [PythonCode]扫描局域网的alive ip地址
  8. ExpandableListView的使用以及信息的高亮显示
  9. hdoj 2046 骨牌铺方格 【DP】+【斐波那契】
  10. php进一法取整、四舍五入取整、忽略小数等的取整数方法大全