vijos 2035 奇数偶数与绚丽多彩的数
描述
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
7 1000000123
样例输出1
287975
样例2
样例输入2
100 1000000123
样例输出2
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)。这个推一推式子就可以用类似矩阵快速幂的方法求出。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll N,P,n,ans=0,C[10][10]; inline ll add(ll x,ll y){
x+=y;
return x>=P?x-P:x;
} struct node{
ll a[41][41]; inline void clear(){
memset(a,0,sizeof(a));
} inline void init(){
clear();
for(int i=0;i<n;i++) a[i][i]=1;
} node operator *(const node &u)const{
node r;
r.clear();
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
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);
return r;
} node operator +(const node &u)const{
node r;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) r.a[i][j]=add(a[i][j],u.a[i][j]);
return r;
}
}base,ANS; inline node ksm(node x,ll y){
node r,q,BA=x; r.init(),q.init();
int i=60;
for(;i;i--) if((1ll<<i)&y) break;
r=x,i--;
for(;i>=0;i--)
if((1ll<<i)&y){
node O=x*BA;
r=r*(q+O)+O;
x=x*O;
}
else{
r=r*(q+x);
x=x*x;
} return r+q;
} inline void solve(){
for(int i=0;i<=5;i++){
base.clear();
n=(i+1)*6;
for(int j=0,X,Y;j<n;j++){
X=j%6,Y=j/6;
if(X) base.a[j][j-1]=X;
if(X<5) base.a[j][j+1]=5-X;
if(Y) base.a[j][j-6]=Y;
if(Y<5) base.a[j][j+6]=i-Y;
} ANS=ksm(base,N-1);
ans=add(ans,C[5][i]*(ll)((4*ANS.a[1][i*6]+i*ANS.a[6][i*6])%P)%P);
} printf("%lld\n",ans);
} int main(){
C[0][0]=1;
for(int i=1;i<=5;i++){
C[i][0]=1;
for(int j=1;j<=i;j++) C[i][j]=C[i-1][j-1]+C[i-1][j];
}
scanf("%lld%lld",&N,&P);
solve();
return 0;
}
vijos 2035 奇数偶数与绚丽多彩的数的更多相关文章
- 输出1-100 , 奇数偶数分别添加标识(for循环语句嵌套if-else语句)
package com.summer.cn; /** * @author Summer * 输出1-100 , 奇数偶数分别添加标识 */ public class Test041518 { publ ...
- 9个绚丽多彩的HTML5进度条动画赏析
进度条在网页应用中越来越广泛了,特别是现在的页面异步局部刷新时代,进度条可以让用户更好的等待操作结果.本文要分享9款绚丽多彩的HTML5进度条动画,有很多还是挺实用的,效果也非常不错. 1.CSS3发 ...
- 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 ...
- C 语言实例 - 判断奇数/偶数
C 语言实例 - 判断奇数/偶数 C 语言实例 C 语言实例 以下实例判断用户输入的整数是奇数还是偶数. 实例 #include <stdio.h> int main() { int nu ...
- 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝
第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...
- c-函数指针(求奇数偶数的和)
#include <stdio.h> /* 编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+...+1/n,当输入 n 为奇数时,调用函数1/1+1/3+...+1/n(利用 ...
- 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 ...
- 关于for循环的几个小练习,例如奇数偶数,阶乘,求和等
1 .100以内的奇数和偶数 var js = ""; var os = ""; for(var i=1;i<101;i++) { if(i%2 == 0 ...
- 剑指offer21----数组中奇数偶数
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 基本实现 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
随机推荐
- vim下ctrl + s 僵死问题的解决
vim下ctrl + s 僵死问题的解决 vim 使用vim习惯性手残Ctrl+S ,解决方法 : Ctrl + Q 就能恢复了
- 11G RAC环境数据库启动和关闭
一步启动Oracle (1) 启动整个集群 # ./crsctl start cluster -all -all选项启动整个集群. 不加-all选项只能启动本节点的服务. (2) 启动本节点集群 以下 ...
- python解决鸡兔同笼问题
# 这个问题,是我国古代著名趣题之一. # 大约在1500年前,<孙子算经>中就记载了这个有趣的问题. # 书中是这样叙述的:“今有雉兔同笼,上有三十五头,下有九十四足, # 问雉兔各几何 ...
- 企业级监控nagios实践
nagios 监控服务应用指南 小区:视频监控,保安 企业工作中为什么要部署监控系统 监控系统相当于哨兵的作用,监控几百台上千台服务器,监控系统非常重要. 监控系统都需要监控 1. 本地资源:负载up ...
- python版 定时任务机制
定时任务的原理 服务器执行一个python脚本 这个脚本,循环执行配置的定时任务地址 Python请求地址, 该地址应该返回, 下次再来执行的秒数. 也就是任务的频率 比如任务希望每3秒执行一次, 那 ...
- MySQL autocommit 和 start transaction
autocommit 和 start transaction 都是事务相关的命令.类似MyISAM的mysql引擎就不支持. autocommit 默认是ON状态,即sql语句是自动提交的 show ...
- Python进阶之网络编程
网络通信 使用网络的目的 把多方链接在一起,进行数据传递: 网络编程就是,让不同电脑上的软件进行数据传递,即进程间通信: ip地址 ip地址概念和作用 IP地址是什么:比如192.168.1.1 这样 ...
- 初识Pyhon
如果你的系统安装了这两个版本,请使用Python 3 如果没有安装Python,请安装Python 3 主要介绍在windows 64位操作系统上安装Python 3 1. 安装Python 首先,检 ...
- C第12章-----堆
#include <stdio.h> #include <stdlib.h> //声明Person结构 //struct Person{ // float heightI ...
- Laravel(4.2)-->whereHas/ whereDoesntHave
在开发过程中,有时间需要用 wherehas 联合查询 出想要的结果,但是有的时候想搜索出不在关联表中出现的数据 whereDoesntHave(例:搜索出开卡的用户和没有开卡的用户)if($is_o ...