Gym100025K
矩阵快速幂
设答案为f(i)
举个例子:
当i==2时,包含0的值有:10,20,30,40,50,60,70,80,90,100;0的个数为11,f(2)=11;
i==3时;可以从i==2的情况递推,
第一步:i==2时的数据范围:1-100;在这100个数后面补0;补0后,这些数在1-1000的范围之内,合法,0的个数增加了100个,也就是10^(i-1);
第二步:把i==2时包含0的有效值拿出来,在这些值后面补0,1,2,3,4,5,6,7,8,9;
比如70;补数之后就成了:700,701,702,703,704,705,706,707,708,709;这样70里面0的个数就被计算了10次。至于700里面由于后面补零增加的一个0,这个可以发现已经在第一步中计算过了。因此加上10*f(i-1);
但要知道100后面补数的话,1001,1003,1003,1004,1005,1006,1007,1008,1009都是不合法的。不合法的情况有9种,每种里面包含0的个数为(i-1)。
因此递推式为f(i)=10*f(i-1)+10^(i-1)-9*(i-1);
接下来就可以愉快的矩阵快速幂了。
#include<bits/stdc++.h>
using namespace std;
int f[];
#define ll long long
ll mod;
ll res[][];
ll ans[];
void Ans()
{
ll tmp[]={};
for(int i=;i<;++i)
{
for(int j=;j<;++j)
{
tmp[i]=(tmp[i]+res[i][j]*ans[j])%mod;;
}
}
for(int i=;i<;++i)ans[i]=tmp[i];
}
void A()
{
ll tmp[][]={};
for(int i=;i<;++i)
{
for(int j=;j<;++j)
{
for(int k=;k<;++k)tmp[i][j]=(tmp[i][j]+res[i][k]*res[k][j])%mod;
}
}
for(int i=;i<;++i)for(int j=;j<;++j)res[i][j]=tmp[i][j];
}
void init(ll n)
{
--n;
res[][]=%mod;res[][]=%mod;res[][]=(-%mod+mod)%mod;
res[][]=%mod;
res[][]=res[][]=;
res[][]=;
for(int i=;i<;++i)ans[i]=;
while(n){
if(n&)Ans();
n>>=;A();
}
cout<<ans[]<<endl;
}
int main()
{
/*
f[1]=1;
for(int i=2;i<=6;++i){
f[i]=10*f[i-1]+pow(10,i-1)-9*(i-1);
cout<<f[i]<<endl;
}
*/
freopen("zeroes.in","r",stdin);
freopen("zeroes.out","w",stdout);
ll k;
cin>>k>>mod;
if(mod==)cout<<<<endl;
else init(k);
}
Gym100025K的更多相关文章
随机推荐
- screen 状态为Attached 连不上
用 screen -ls, 显式当前状态为Attached, 但当前没有用户登陆些会话.screen此时正常状态应该为(Detached) 此时用screen -r ,怎么也登不上. 最后找到解决方 ...
- python学习笔记之—— calendar(日历)模块
内置函数month() #!/usr/bin/python import calendar print calendar.month(2017,12) 输出: December 2017 Mo Tu ...
- Android屏幕适配工具
这里需要用到一个jar包,下载拿到这个jar包后直接双击就可以生成市场大部分主流屏幕尺寸了.然后只要把生成好的xml尺寸文件拷贝到相应的value文件中即可.很方便,以后再也不用担心适配繁琐的问题了. ...
- sqlserver为数据库表增加自增字段
需求: 数据库为SQLServer.对已有的数据库表customer加一个序号字段,一次性对所有现存客户加上编号,并在新建客户时自动增加一个编号,数值自增1. 解决方法: 1. 复制表结构.把原 ...
- 计算机二进制表示、cpu架构(x86_64)、cpu频率、核心、主板
计算机二进制表示 色彩二进制表示: 红色 255,0,0绿色 0,255,0蓝色 0,0,255 文字二进制表示:A 65a 97 cpu架构 cpu架构有精简指令集和复杂指令集两种精简指令集cpu有 ...
- ES6入门——类的概念
1.Class的基本用法 概述 JavaScript语言的传统方式是通过构造函数,定义并生成新对象.这种写法和传统的面向对象语言差异很大,下面是一个例子: function Point(x, y) { ...
- Python 中单双引号
TODO, 在python中, 其实单双引号还是有分别的, 具体是什么?
- SQL SERVER常用语法汇总
阅读目录 一.SQL分类 二.基础语句 三.sql技巧 四.(MS SQL Server)SQL语句导入导出大全 回到目录 一.SQL分类 DDL—数据定义语言(CREATE,ALTER,DROP,D ...
- Hadoop HBase概念学习系列之行、行键(十一)
行是由列簇中的列组成.行根据行键依照字典顺序排序. HBase的行使用行键标识,可以使用行键查询整行的数据. 对同一个行键的访问都会落在同样的物理节点上.如果表包含2个列簇,属于两个列簇的文件还是保存 ...
- September 03rd 2017 Week 36th Sunday
What does it profit a man if he gains the whole world and loses his own soul? 失去灵魂,赢得世界又如何? It matte ...