【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 ...
随机推荐
- 解决 安装cocoapods失败,提示 requires Ruby version >=2.2.2
步骤如下: rvm install ruby-2.2 但是,但是竟然报错了,具体我忘记额,但是是权限和brew的问题,那么我又转向修复brew: // 清理原来brew rm -rf /usr/loc ...
- 从tabBarController的一个item上的控制器跳转到另一个item上的控制器
先从习惯性的tabBarController开始,很多应用的外框都是用这个开始的,而从tabBarController的一个item上的控制器跳转到另一个上的,往往都是直接通过点击tabBar上的不同 ...
- 在 CentOS7 之部署 Redis3
CentOS7 之 Redis3 学习笔记 1 Redis 官网: http://www.redis.io/ 2 Redis 的下载地址: http://download.redis.io/relea ...
- PHP实现把文本中的URL转换为链接的auolink()
转载:http://www.jb51.net/article/52916.htm 其实我在<把文本中的URL地址转换为可点击链接的JavaScript.PHP自定义函数>一文中介绍过PHP ...
- C# CompareTo 和 String.Compare
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(二)
七. 构建临时系统 1. 通用编译指南 a. 确认是否正确设置了 LFS 环境变量 echo $LFS b. 假定你已经正确地设置了宿主系统的符号链接: 1)shell 使用的是 bash. 2)sh ...
- 常见博客API
新浪博客 http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php 网易博客 http://os.blog.163.com/ap ...
- nginx下配置404错误页面
1.创建自己的404.html页面,并放于网站根目录. 2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 3.更改nginx.conf(或 ...
- 【Python数据分析】工作日发文章比周末发文章访问量高?
前言 看前面有位朋友分析了一下每天某个时间发文章的访问量区别,以讨论非系统性因素对文章访问量的影响.之所以进一步讨论工作日和周末发文对文章访问量的影响,一是觉得很有意思,二是毕业设计与此有很大关系,三 ...
- POJ 2225 / ZOJ 1438 / UVA 1438 Asteroids --三维凸包,求多面体重心
题意: 两个凸多面体,可以任意摆放,最多贴着,问他们重心的最短距离. 解法: 由于给出的是凸多面体,先构出两个三维凸包,再求其重心,求重心仿照求三角形重心的方式,然后再求两个多面体的重心到每个多面体的 ...