Codeforces 551 D. GukiZ and Binary Operations
\(>Codeforces \space 551 D. GukiZ and Binary Operations<\)
题目大意 :给出 \(n, \ k\) 求有多少个长度为 \(n\) 的序列 \(a\) 满足 \((a_1\ and \ a_2)or(a_2\ and \ a_3)or..or(a_{n-1}\ and \ a_n) = k\) 且 \(a_i \leq k \leq 2^l\)
并输出方案数在$\mod m $ 意义下的值
\(0≤ n ≤ 10^{18},\ 0 ≤ k ≤ 10^{18}, \ 0 \leq l \leq 64, \ 1 \leq m \leq 10^9 + 7\)
解题思路 :
考虑对于二进制按位拆开来考虑,设某一位最终为 \(i\) 的方案为 \(g_i \ (i = 0 / 1)\)
因为位与位之间相互不影响,由此可以得到 $Ans = \sum_{i = 0}^{l - 1} g_{(2^i and \space k)} $
问题转化为如何求出 \(g_i\), 观察发现 \(g_i\) 只要求出一个,另外一个就是 \(2^n - g_i\)
仔细分析后发现 \(g_0\) 比较好求,设 \(f_i\) 为前 \(i\) 位的式子的结果为 \(0\) 的方案
考虑第 \(i\) 位后答案若要为 \(0\) ,如果第 \(i\) 位选 \(1\),那么第 \(i - 1\) 位必然选 \(1\) ,方案数就是 \(f_{i-2}\)
否则第 \(i\) 位选 \(0\), 第 \(i-1\) 位选什么都可以,方案数是 \(f_{i-1}\) 所以有 \(f_i = f_{i-1} + f_{i-2}\)
发现式子其实就是斐波那契数列的递推式, 用矩阵快速幂求出后把得到的 \(g_0\) 和 \(g_1\) 带回先前的式子算出答案即可
/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
#define int ll
int n, k, l, Mod;
const int le = 2;
struct Matrix{
int a[le+5][le+5];
inline Matrix(){ memset(a, 0, sizeof(a)); }
inline void write(){
for(int i = 1; i <= le; i++, putchar('\n'))
for(int j = 1; j <= le; j++) cout << a[i][j] << " ";
}
};
inline Matrix Mult(Matrix A, Matrix B){
Matrix C;
for(int i = 1; i <= le; i++)
for(int j = 1; j <= le; j++)
for(int k = 1; k <= le; k++)
(C.a[i][j] += A.a[i][k] * B.a[k][j]) %= Mod;
return C;
}
inline Matrix Power(Matrix a, int b){
Matrix ans = a; b--;
for(; b; b >>= 1, a = Mult(a, a))
if(b & 1) ans = Mult(ans, a);
return ans;
}
inline ll Pow(int a, int b){
int ans = 1;
for(; b; b >>= 1, a = a * a % Mod)
if(b & 1) ans = ans * a % Mod;
return ans;
}
main(){
read(n), read(k), read(l), read(Mod);
if(l < 63 && k >= (1ll << l)) return puts("0"), 0;
int all = Pow(2, n);
Matrix A, B;
A.a[1][1] = A.a[2][1] = 1;
B.a[1][1] = B.a[1][2] = B.a[2][1] = 1;
B = Power(B, n), A = Mult(B, A);
int now = (all - A.a[1][1] + Mod) % Mod, ans = 1 % Mod;
for(int i = 0; i < l; i++)
if((1ll << i) & k) (ans *= now) %= Mod;
else (ans *= A.a[1][1]) %= Mod;
cout << ans % Mod;
return 0;
}
Codeforces 551 D. GukiZ and Binary Operations的更多相关文章
- Codeforces 551D GukiZ and Binary Operations(矩阵快速幂)
Problem D. GukiZ and Binary Operations Solution 一位一位考虑,就是求一个二进制序列有连续的1的种类数和没有连续的1的种类数. 没有连续的1的二进制序列的 ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations 矩阵快速幂优化dp
D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes inpu ...
- D. GukiZ and Binary Operations(矩阵+二进制)
D. GukiZ and Binary Operations We all know that GukiZ often plays with arrays. Now he is thinking ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)
题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations
得到k二进制后,对每一位可取得的方法进行相乘即可,k的二进制形式每一位又分为2种0,1,0时,a数组必定要为一长为n的01串,且串中不出现连续的11,1时与前述情况是相反的. 且0时其方法总数为f(n ...
- GukiZ and Binary Operations CodeForces - 551D (组合计数)
大意: 给定$n,k,l,m$, 求有多少个长度为$n$, 元素全部严格小于$2^l$, 且满足 的序列. 刚开始想着暴力枚举当前or和上一个数二进制中$1$的分布, 但这样状态数是$O(64^3)$ ...
- codeforces 551 C GukiZ hates Boxes
--睡太晚了. ..脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最開始都站在第一个箱子的左边, 每个人在每一秒钟都必须做出两种选 ...
- Codeforces 551 E - GukiZ and GukiZiana
E - GukiZ and GukiZiana 思路:分块, 块内二分 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC ...
- [codeforces 339]D. Xenia and Bit Operations
[codeforces 339]D. Xenia and Bit Operations 试题描述 Xenia the beginner programmer has a sequence a, con ...
随机推荐
- 加overflow-hidden就可以解决高度塌陷问题,overflow-触发BFC
1.BFC 全称是块级排版上下文,用于对块级元素排版,默认情况下只有根元素(body)一个块级上下文,但是如果一个块级元素 设置了float:left,overflow:hidden或position ...
- @EnableEurekaClient源码分析
@EnableEurekaClient注解,从源码的角度分析是如何work的 NetFlix Eureka client Eureka client 负责与Eureka Server 配合向外提供注册 ...
- python中的binascii模块
binascii模块拿来干嘛的? 答:进制转换xxoo #!/usr/bin/env python # encoding:utf-8 # by i3ekr import binascii s = &q ...
- centos 挂在ntfs
Installing build-essentials in CentOS (make, gcc, gdb):http://www.techblogistech.com/2012/03/install ...
- git - 开发者电脑与服务器的配置
首先公司要有一台git服务器,现在一般都托管在github服务器上,在中国可能会托管到oschina上,oschina有一点好处就是可以免费托管私有项目,而在github上想要托管自己的项目是收费的, ...
- spring mvc注解文件上传下载
需要两个包: 包如何导入就不介绍了,前端代码如下(一定要加enctype="multipart/form-data"让服务器知道是文件上传): <form action=&q ...
- 【python】发送邮件
从网上找了一些用python发邮件的教程,学习一下: 1.发送普通的文本邮件 http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.ht ...
- CountDownLatch源码浅析
Cmd Markdown链接 CountDownLatch源码浅析 参考好文: JDK1.8源码分析之CountDownLatch(五) Java并发之CountDownLatch源码分析 Count ...
- vscode的go插件安装
vscode安装go的很多插件都是失败,如下: Installing 5 tools at E:\www\go_project\bin go-symbols guru gorename goretur ...
- <一>dubbo框架学前原理介绍
alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...