描述

Q先生是一个热爱学习的男孩子。

他认为一个 n 位的正整数 x 若能被称作是绚丽多彩的,一定要满足对于{1,3,5,7,9} 中任意一个奇数或者没有在 x 中出现,或者在 x 中出现了恰好奇数次;同时对于 {0,2,4,6,8} 中任意的偶数或者没有在 x 中出现,或者在x 中出现了偶数次。同时需要注意 x 是不能有前导零的。

例如 141221242 就是一个九位的绚丽多彩的数。

现在Q先生给定了正整数 n 与另外一个正整数 p,希望你统计出来一共有多少不超过 n 位的绚丽多彩的数,并输出模 p后的余数。

格式

输入格式

输入有一行,包含两个由空格隔开的正整数,分别为 n 和 p。

输出格式

输出一个正整数,表示不超过 n 位的绚丽多彩数的总数模 p 后的余数。

样例1

样例输入1

  1. 7 1000000123

样例输出1

  1. 287975

样例2

样例输入2

  1. 100 1000000123

样例输出2

  1. 123864868

限制

对于100%的数据,2<=n<=2^60,10^9<=p<=2*10^9。

昨晚打的某个比赛的题。

我们发现偶数出现偶数次和不出现都等价于出现的次数%2=0,奇数出现奇数次相当于出现次数%2=1,当然奇数还可能不出现。所以我们可以枚举哪些奇数是不出现的,然后剩下的奇数满足出现奇数次,偶数出现偶数次就行了。

还可以发现我们没有必要知道每个奇数/偶数出现的次数的奇偶性,只需要知道有多少个 奇数/偶数 出现 奇数/偶数 次就行了。也就是状态压缩之后,我们只需要一个两位的五进制数就可以表示一个状态。

而我们在外层也可以直接枚举有几个奇数出现过,然后再将这种情况下的方案总数乘上一个组合数就行了。

但是这个题要求的数是<=n位的没有前导零的满足条件的数的个数,所以我们要求的最终转移方阵不是某个方阵A的n-1次方,而是A^0+A^1+....A^(n-1)。这个推一推式子就可以用类似矩阵快速幂的方法求出。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<cstring>
  7. #define ll long long
  8. using namespace std;
  9. ll N,P,n,ans=0,C[10][10];
  10.  
  11. inline ll add(ll x,ll y){
  12. x+=y;
  13. return x>=P?x-P:x;
  14. }
  15.  
  16. struct node{
  17. ll a[41][41];
  18.  
  19. inline void clear(){
  20. memset(a,0,sizeof(a));
  21. }
  22.  
  23. inline void init(){
  24. clear();
  25. for(int i=0;i<n;i++) a[i][i]=1;
  26. }
  27.  
  28. node operator *(const node &u)const{
  29. node r;
  30. r.clear();
  31. for(int k=0;k<n;k++)
  32. for(int i=0;i<n;i++)
  33. for(int j=0;j<n;j++) r.a[i][j]=add(r.a[i][j],a[i][k]*(ll)u.a[k][j]%P);
  34. return r;
  35. }
  36.  
  37. node operator +(const node &u)const{
  38. node r;
  39. for(int i=0;i<n;i++)
  40. for(int j=0;j<n;j++) r.a[i][j]=add(a[i][j],u.a[i][j]);
  41. return r;
  42. }
  43. }base,ANS;
  44.  
  45. inline node ksm(node x,ll y){
  46. node r,q,BA=x; r.init(),q.init();
  47. int i=60;
  48. for(;i;i--) if((1ll<<i)&y) break;
  49. r=x,i--;
  50. for(;i>=0;i--)
  51. if((1ll<<i)&y){
  52. node O=x*BA;
  53. r=r*(q+O)+O;
  54. x=x*O;
  55. }
  56. else{
  57. r=r*(q+x);
  58. x=x*x;
  59. }
  60.  
  61. return r+q;
  62. }
  63.  
  64. inline void solve(){
  65. for(int i=0;i<=5;i++){
  66. base.clear();
  67. n=(i+1)*6;
  68. for(int j=0,X,Y;j<n;j++){
  69. X=j%6,Y=j/6;
  70. if(X) base.a[j][j-1]=X;
  71. if(X<5) base.a[j][j+1]=5-X;
  72. if(Y) base.a[j][j-6]=Y;
  73. if(Y<5) base.a[j][j+6]=i-Y;
  74. }
  75.  
  76. ANS=ksm(base,N-1);
  77. ans=add(ans,C[5][i]*(ll)((4*ANS.a[1][i*6]+i*ANS.a[6][i*6])%P)%P);
  78. }
  79.  
  80. printf("%lld\n",ans);
  81. }
  82.  
  83. int main(){
  84. C[0][0]=1;
  85. for(int i=1;i<=5;i++){
  86. C[i][0]=1;
  87. for(int j=1;j<=i;j++) C[i][j]=C[i-1][j-1]+C[i-1][j];
  88. }
  89. scanf("%lld%lld",&N,&P);
  90. solve();
  91. return 0;
  92. }

  

vijos 2035 奇数偶数与绚丽多彩的数的更多相关文章

  1. 输出1-100 , 奇数偶数分别添加标识(for循环语句嵌套if-else语句)

    package com.summer.cn; /** * @author Summer * 输出1-100 , 奇数偶数分别添加标识 */ public class Test041518 { publ ...

  2. 9个绚丽多彩的HTML5进度条动画赏析

    进度条在网页应用中越来越广泛了,特别是现在的页面异步局部刷新时代,进度条可以让用户更好的等待操作结果.本文要分享9款绚丽多彩的HTML5进度条动画,有很多还是挺实用的,效果也非常不错. 1.CSS3发 ...

  3. Codeforces Round #449 (Div. 2) B. Chtholly's request【偶数位回文数】

    B. Chtholly's request time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  4. C 语言实例 - 判断奇数/偶数

    C 语言实例 - 判断奇数/偶数 C 语言实例 C 语言实例 以下实例判断用户输入的整数是奇数还是偶数. 实例 #include <stdio.h> int main() { int nu ...

  5. 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝

    第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...

  6. c-函数指针(求奇数偶数的和)

    #include <stdio.h> /* 编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+...+1/n,当输入 n 为奇数时,调用函数1/1+1/3+...+1/n(利用 ...

  7. 893. Groups of Special-Equivalent Strings 奇数偶数位上的相同数

    [抄题]: You are given an array A of strings. Two strings S and T are special-equivalent if after any n ...

  8. 关于for循环的几个小练习,例如奇数偶数,阶乘,求和等

    1 .100以内的奇数和偶数 var js = ""; var os = ""; for(var i=1;i<101;i++) { if(i%2 == 0 ...

  9. 剑指offer21----数组中奇数偶数

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 基本实现 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...

随机推荐

  1. android 代码中及xml中设置透明

    在布局文件的属性中,比如要设置一个LineaerLayout的背景为灰色透明.首先查RGB颜色表灰色是:#9E9E9E,AA代表透明,(透明度从00到FF,00表示完全透明),所以,设置其属性:and ...

  2. centos6上安装mysql8.0版本

    本博客是采用yum源的方式安装,非常的方便和快捷.(redhat 与centos7 等操作系统都可以采用此方法,步骤大体一致) mysql官网地址:   https://dev.mysql.com 开 ...

  3. postman对登陆进行压力测试的方法

    1.填写完整参数,设置好变量,选择好环境,保存好 2.将变量mobile_phone和password的值以如下图的格式,填写到Excel表格中,然后以csv(逗号分隔)的形式进行保存 3.点击此测试 ...

  4. 【转】C# WinForm中的Label如何换行

    第一种是把Label的AutoSize属性设为False,手动修改Label的大小.这样的好处是会因内容的长度而自动换行,但是当内容的长度超过所设定的大小时,多出的内容就会无法显示.因此,这种方法适合 ...

  5. RTP/RTCP协议详解

    1.简介 目前,在IP网络中实现实时语音.视频通信和应用已经成为网络应用的一个主流技术和发展方向,本文详细介绍IP协议族中用于实时语音.视频数据传输的标准协议RTP( Real-time Transp ...

  6. 利用python库twilio来免费发送短信

    大家好,我是四毛,最近开通了个人公众号“用Python来编程”,欢迎大家“关注”,这样您就可以收到优质的文章了. 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图 ...

  7. python基础知识10-描述器和装饰器

    课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...

  8. 【转】Unable to load native-hadoop library for your platform(已解决)

    1.增加调试信息寻找问题 2.两种方式解决unable to load native-hadoop library for you platform 附:libc/glibc/glib简介 参考: 1 ...

  9. 【HDU 3336】Count the string(KMP+DP)

    Problem Description It is well known that AekdyCoin is good at string problems as well as number the ...

  10. [第一波模拟\day3\T3]{益智游戏}(game.cpp)

    [问题描述] 小P和小R在玩一款益智游戏.游戏在一个正权有向图上进行. 小P控制的角色要从A点走最短路到B点,小R控制的角色要从C点走最短路到D点. 一个玩家每回合可以有两种选择,移动到一个相邻节点或 ...