【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 ...
随机推荐
- AFNetWorking https请求 SSL认证 自制证书
1.服务器会给一个证书,一般为.pem格式证书 2.将.pem格式的证书转换成.cer格式的证书 打开电脑自带终端 ,进入到桌面 cd Desktop 回车回到桌面Desktop Admin$ 输入 ...
- ORA-04091: table xxxx is mutating, trigger/function may not see it
今天同事让我看一个触发器为什么老是报错,当执行DML语句触发触发器后,会报ORA-04091错误:ORA-04091: table xxxx is mutating, trigger/function ...
- 查看Linux版本信息
如何查看Linux系统使用的版本信息呢? 下面这篇文章收集.整理了一些常见的查看Linux系统版本的方法.由于手头只有Oracle Linux.Centos Linux.Redhat Linux三个版 ...
- Linux系统安装Apache 2.4.6
Apache简介 Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广 ...
- Ubuntu上通过nginx部署Django笔记
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式.今天在Ubuntu上使用Nginx部署Django服务,虽然不是第一次搞这个了,但是发现还是跳进了好多坑,g ...
- Hadoop HDFS负载均衡
Hadoop HDFS负载均衡 转载请注明出处:http://www.cnblogs.com/BYRans/ Hadoop HDFS Hadoop 分布式文件系统(Hadoop Distributed ...
- Ubuntu14-04 MySQL-5.6.21通用二进制安装
#卸载mysql /etc/init.d/mysqld stop &> /dev/null killall mysqld &> /dev/null sudo rm -rf ...
- JS中误用/g导致的正则test()无法正确重复执行
一个简单的利用正则判断输入是否为数字: input1 = '0281234567';input2 = '0282345678';var reg = /^\d+$/g; reg.test(input1) ...
- java md5
需求是,上传文件到HDFS,然后生成同名的MD5文件,基本示例如下: public static String getMD5(InputStream inputStream) { byte[] buf ...
- 2015.2.16 关于delphi web控件打开新网页时弹出关闭页面(js代码)出错的解决办法研究
参考网址1:http://www.csharpwin.com/csharpspace/2360.shtml...参考网址2:http://www.oschina.net/question/234345 ...