矩阵快速幂

设答案为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. java.lang.VerifyError: com/google/android/gms/measurement/internal/zzw

    android studio  com.google.android.gms:play-services 运行报错:java.lang.VerifyError: com/google/android/ ...

  2. Condition使用

    面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法,    能够支持2个生产者线程以及10个消费者线程的阻塞调用 有两种方法 1.使用wait和notify/notify ...

  3. 如何进行 Python性能分析,你才能如鱼得水?

    [编者按]本文作者为 Bryan Helmig,主要介绍 Python 应用性能分析的三种进阶方案.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 我们应该忽略一些微小的效率提升,几乎在 9 ...

  4. 显示脉冲效果的PulsingView

    显示脉冲效果的PulsingView 效果如下: 源码: PulsingView.h 与 PulsingView.m // // PulsingView.h // PulsingView // // ...

  5. AD用户登录验证,遍历OU(LDAP)

    先安装python-ldap模块 1.验证AD用户登录是否成功 import sqlite3,ldap domainname='cmr\\' username='zhangsan' ldapuser ...

  6. Matlab 之meshgrid, interp, griddata 用法和实例(转)

    http://blog.sina.com.cn/s/blog_67f37e760101bu4e.html 实例结果http://wenku.baidu.com/link?url=SiGsFZIxuS1 ...

  7. (转)光照模型及cg实现

    经典光照模型(illumination model) 物体表面光照颜色由入射光.物体材质,以及材质和光的交互规律共同决定. 由于环境光给予物体各个点的光照强度相同,且没有方向之分,所以在只有环境光的情 ...

  8. Beanstalkd 的理解

    Beanstalkd 的理解 Beanstalkd 是一个轻量级的内存型队列,利用了和Memcache 类似的协议.其官网beanstakkd官网 下方的感谢语说: Many thanks to me ...

  9. 个人技术博客(1/2)android布局技巧

    (1)weight属性的合理应用 当使用match_parent(fill_parent)时,需要经过计算,否则会出现如下情况 代码: <LinearLayout xmlns:android=& ...

  10. 026.3 网络编程 TCP聊天

    分为客户端和服务端,分别进行收发操作##########################################################################客户端:###思 ...