【poj3875】 Lights
http://poj.org/problem?id=3875 (题目链接)
题意
有M个N位的不同的二进制数,他们异或起来前v位等于1,求这m个数的不同组合方式(同一组数不同顺序不算)。
Solution
如果任意两个数可以相同就非常好做了,然而。。事实总是那么令人悲伤。
考虑dp。假设最后异或出来的数为${V}$,令${f_m}$表示m个数的不同方案(这里我们先求解不同顺序算不同方案的,更好处理一些)。那么如果我们先选出其中${m-1}$个数,它的方案就是:
$${(m-1)!×C_{2^n}^{m-1}}$$
这很好理解,一共有${2^n}$个数可供选择,从中任意选取${m-1}$个数,令其为${a_1,a_2,a_3······a_{m-1}}$那么剩下的第${a_m}$个数就可以确定了:
$${\because a_1~XOR~a_2~XOR······XOR~a_m=V}$$
$${\therefore a_m=V~XOR~a_1~XOR~a_2~XOR······XOR~a_{m-1}}$$
然而问题来了,如果${a_m}$求出来与之前已经选择好了的${m-1}$个数中的某一个相等怎么办?
假设${a_m=a_1}$,因为相同的数异或起来等于0,则有:
$${a_2~XOR~a_3~XOR······XOR~a_{m-1}=V}$$
这个式子的方案数代表什么,不就是代表${f_{m-2}}$吗。所以我们可以列出dp方程:
$${f_m=(m-1)!×C_{2^n}^{m-1}-(m-1)×(2^n-(m-2))×f_{m-2}}$$
其中第一项${(m-1)!×C_{2^n}^{m-1}}$很好理解,就是不考虑${a_m}$与之前已经选好的数相同的方案数。
第二项中${(m-1)}$表示${a_m}$可以与${m-1}$个数中的任意一个相同,${(2^n-(m-2))}$表示${a_m}$的值的选择方案。
这里还要注意一个地方:${C_{2^n}^{m-1}}$怎么求。考虑Lucas定理求解组合数取模:
$${Lucas(n,m)=C_{n~mod~p}^{m~mod~p}*Lucas(n/p,m/p)}$$
因为m最大为1000,恒小于模数p,所以${Lucas(n/p,m/p)=1}$,所以:
$${C_{2^n}^{m-1}=C_{2^{n}~mod~p}^{m~mod~p}}$$
$${ans=\frac{f[m]}{m!}}$$
细节
此时,问题已经得到了解决。什么?你说过不了样例?
嘿嘿嘿,→_→。
显然${f[0]=0,f[1]=1}$,那么${f[2]=?}$。
考虑${v=0}$的情况,因为两个数不能相同,而只有相同的两个数的异或和等于0,所以${f[2]=0}$。
而当${v>0}$时,${f[2]=C_{2^n}^{1}}$。
此时,问题已经得到了解决(真的)
代码
// poj3875
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define MOD 10567201
#define Pi acos(-1,0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=2000;
LL f[maxn],fac[maxn],C[maxn];
int n,m,v; LL power(LL a,LL b) {
LL res=1;
while (b) {
if (b&1) res=res*a%MOD;
b>>=1;a=a*a%MOD;
}
return res;
}
int main() {
fac[0]=1;for (int i=1;i<=1000;i++) fac[i]=fac[i-1]*i%MOD;
while (scanf("%d%d%d",&n,&m,&v)!=EOF) {
if (!n && !m && !v) break;
LL tmp=power(2,n);
C[0]=1;
for (int i=1;i<=m;i++) {
int inv=power(i,MOD-2);
C[i]=C[i-1]*(tmp-i+1)%MOD*inv%MOD;
}
f[1]=1;f[0]=0;if (v==0) f[2]=0;else f[2]=tmp;
for (int i=3;i<=m;i++) {
f[i]=(fac[i-1]*C[i-1]%MOD-(i-1)*(tmp-(i-2))%MOD*f[i-2]%MOD+MOD)%MOD;
}
LL inv=power(fac[m],MOD-2);
printf("%lld\n",inv*f[m]%MOD);
}
return 0;
}
【poj3875】 Lights的更多相关文章
- 【POJ】1222 EXTENDED LIGHTS OUT
[算法]高斯消元 [题解] 高斯消元经典题型:异或方程组 poj 1222 高斯消元详解 异或相当于相加后mod2 异或方程组就是把加减消元全部改为异或. 异或性质:00 11为假,01 10为真.与 ...
- 【BZOJ】1770 [Usaco2009 Nov]lights 燈
[算法]高斯消元-异或方程组 [题解]良心简中题意 首先开关顺序没有意义. 然后就是每个点选或不选使得最后得到全部灯开启. 也就是我们需要一种确定的方案,这种方案使每盏灯都是开启的. 异或中1可以完美 ...
- 【转】Using Gamma 2.2
This is a detailed description of the work with Gamma 2.2. If you are only interested in exact instr ...
- 【Unity】13.2 通过Lighting Window设置相关参数
分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二. ...
- 【Unity】3.4 将现有的3ds Max模型导入到Unity
分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 这一节我们用一个带有"装子弹和上膛"动画的"枪"模型,介绍在3ds Max 20 ...
- 【Unity】2.3 项目浏览器和资源的组织
分类:Unity.C#.VS2015 创建日期:2016-03-29 一.Project-工程浏览器 前面我们说过,Unity中的Project View(称为工程浏览器)相当于VS2015中的解决方 ...
- 【Mood-14】龙虎榜 活跃在github中的1000位中国开发者
Last cache created on 2015-01-07 by Github API v3. ♥ made by hzlzh just for fun. Rank Gravatar usern ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
随机推荐
- IOS开发之Bug--iOS7View被导航栏遮挡问题的解决
在实际开发中,遇到在UITextView的frame等于当前控制器的View的frame的情况下,然后运行的时候,发现控制器的Frame的高度y值会从导航条的位置64变化到0. 导致UITextVie ...
- 【转】Android Studio下加入百度地图的使用 (一)——环境搭建
最近有学 生要做毕业设计,会使用到定位及地图信息的功能,特此研究了一下,供大家参考,百度定位SDK已经更新到了5.0,地图SDK已经更新到了3.5,但是在 AndroidStudio中使用还是存在一些 ...
- yii2分页的基本使用及其配置详解
作者:白狼 出处:http://www.manks.top/yii2_linkpager_pagination.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- 数据库设计范式1——三范式
一讲到数据库设计,大家很容易想到的就是三范式,但是第四.第五范式又是什么,不是很清楚,三范式到底怎么区分,也不清楚,作为数据库设计的基础概念,我再讲解下数据库范式. Normal form Bri ...
- PostgreSQL-psql
打开查看元命令实际执行的sql的功能和关闭 yun=> \set ECHO_HIDDEN on yun=> \set ECHO_HIDDEN off psql中输入\?查看命令提示 资讯性 ...
- [嵌入式开发]Linux性能分析——上下文切换
一.从一个问题说起 相信很多人在玩手机还是PC时,都曾碰到过这样一种情况,安装的软件多了系统性能就变慢了,但是去查看CPU利用率一直都低于10%,内存也很充足.我在近期的开发工作中就碰到了类似的情况, ...
- mongoDB的安装(一)
0.安装环境说明: linux系统:centos6.5 mongoDB版本:mongodb-linux-x86_64-rhel62-3.2.7.tgz 1.下载 mongoDB的下载:https:// ...
- 某中国500强企业BI系统成功应用案例
随着某集团20多年的不断发展发展,现已成为中国500强.中国大企业集团竞争力前25强.中国信息化标杆企业和国家重点火炬高新技术企业.拥有总资产数十亿元.员工数万名,涉足电力.家电.能源.等多个行业,并 ...
- 利用Caffe做回归(regression)
Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域.绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还 ...
- POJ 2955 Brackets --最大括号匹配,区间DP经典题
题意:给一段左右小.中括号串,求出这一串中最多有多少匹配的括号. 解法:此问题具有最优子结构,dp[i][j]表示i~j中最多匹配的括号,显然如果i,j是匹配的,那么dp[i][j] = dp[i+1 ...