矩阵快速幂

设答案为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的更多相关文章

随机推荐

  1. Spring Boot—04文件上传

    package com.smartmap.sample.ch1.controller.view; import java.io.File; import java.io.IOException; im ...

  2. Java 实验案例(多态)

    实验任务 任务一:图形面积周长计算小程序 任务二:饲养员喂养动物程序 实验内容: 任务一: 图形面积周长计算 任务目的: 掌握多态的含义及应用场合 掌握上转型对象和多态的实现 掌握abstract关键 ...

  3. 10个经典的Android开源应用项目

    Android开发又 将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧和 创造力.学习开源代码是掌握技术的 ...

  4. Axure中移动端原型设计方法(附IPhoneX和IPhone8最新模板)

    Axure中移动端原型设计方法(附IPhoneX和IPhone8最新模板) 2018年4月16日luodonggan Axure中基于设备模板的移动端原型设计方法(附IPhoneX和IPhone8最新 ...

  5. 【Oracle】PL/SQL Developer使用技巧(持续更新中)

    1.关键字自动大写 在sql命令窗口中输入SQL语句时,想要关键字自动大写,引人注目该怎么办呢? 一步设置就可以达成了.点击Tools->Preference->Editor,看到截图中这 ...

  6. datediff

    DateDiff()是计算机函数. 中文名 日期比较函数 外文名 DateDiff() 作    用 得 出两个日期之间的间隔 用    途 返回两个日期之间的差值 允许数据类型 timeinterv ...

  7. [翻译] MotionBlur

    MotionBlur https://github.com/fastred/MotionBlur MotionBlur allows you to add motion blur effect to ...

  8. Linux FFmpeg(含x264、lame插件)安装记录

    What is FFmpeg? FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案. What is x264? H. ...

  9. 绛河 初识WCF4

    参考: http://blog.csdn.net/anlun/article/details/44860821 第四篇 初探通信--ChannelFactory 通过前几篇的学习,我们简单了解了WCF ...

  10. Centos7+Mysql80安装+远程链接开启

    CentOS7安装mysql80 下载repo源 在xshell运行命令 # wget http://repo.mysql.com/mysql80-community-release-el7.rpm ...