兔子的晚会 (xor.c/pas/cpp)
=============================

很久很久之前,兔子王国里居住着一群兔子。每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年。

在新年晚会上,兔子国王和他的守卫们坐在观众席的第一排,兔子国王坐在这排最中间的位置,然后国王两边各坐有恰好相同数目的n个守卫, 我们按照第一排从左到右的顺序为国王和守卫分别编号为1到2*n+1。

在晚会上,兔子们的脸上都洋溢着幸福的笑容,兔子国王为了量化自己和守卫们的幸福度,就将晚会开始时,为第i个兔子分配一个幸福度记为a_i,当然这其中也包括国王自己的幸福度。

国王初始分配的幸福度总是在[0, m]之间。

在新年晚会结束之后,兔子国王和守卫们就会因为观看了精彩绝伦的晚会,幸福度都提升了x,即第i只兔子的幸福度变为了(a_i + x)

但是在晚会开始之前,国王和守卫们并不知道这场晚会的精彩程度如何,所以他们只能估计出x的范围在[L, R]之间。

现在国王希望计算,初始时他和守卫共有多少种不同的幸福度方案,能够使得晚会结束后,所有兔子的幸福度xor和可能为0。

输入格式

第一行四个整数n,m, L和R,意义如题目描述所示

输出格式

一行一个整数,表示可能的幸福度方案的数目,结果对1000000007取模

样例输入

1 3 1 3

样例输出

12

数据规模
对于20%的数据, 1 <= n, m <= 5, 1 <= L <= R <= 10
对于40%的数据, 1 <= n, m <= 100, 1 <= L <= R <= 100
对于70%的数据, 1 <= n, m <= 500, 1 <= L <= R <= 500
对于100%的数据, 1 <= n, m <= 1000, 1 <= L <= R <= 1000

样例解释
对于样例,共有以下几种分配幸福度的方案:
(0,1,2)
(0,2,1)
(0,2,3)
(0,3,2)
(1,0,2)
(1,2,0)
(2,0,1)
(2,0,3)
(2,1,0)
(2,3,0)
(3,0,2)
(3,2,0)

//贴份AC代码,表示看不懂
//大神路过请留言
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<iostream>
#include<algorithm>
#define FILE "xor"
typedef long long ll;
typedef double lf;
namespace IO{
char buf[<<],*fs,*ft;
inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,,<<,stdin),fs==ft))?:*fs++;}
inline int read(){
int x=,rev=,ch=getc();
while(ch<''||ch>''){if(ch=='-')rev=;ch=getc();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getc();}
return rev?-x:x;
}
}using namespace IO;
namespace Operation{
const int dydxh(int(1e9)+);
inline int add(int a,int b){return (a+=b)>=dydxh?a-dydxh:a;}
inline int mul(int a,int b){return 1LL*a*b%dydxh;}
inline int pow(int a,int b){int c=;for(;b;b>>=,a=mul(a,a))if(b&)c=mul(c,a);return c;}
inline int inv(int a){return pow(a,dydxh-);}
}using namespace Operation;
const int MAXN(),D();
int n,m,L,R,ans,H,lim;
void init(){
n=read()<<|,m=read(),L=read(),R=read();
for(H=;H>=;H--)
if(((m+R)>>H)&)
break;
lim=<<(++H);
}
int f[];
void FWT(int *f){
for(int i=;i<H;i++)
for(int S=;S<lim;S++)
if(!((S>>i)&)){
int l=f[S],r=f[S|(<<i)];
f[S]=add(l,r),f[S|(<<i)]=(l-r+dydxh)%dydxh;
}
}
int count(int st){
memset(f,,sizeof f);
for(int i=st;i<=st+m;i++)
f[i]=;
FWT(f);
for(int S=;S<lim;S++)
f[S]=pow(f[S],n);
FWT(f);
return mul(f[],inv(lim));
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
init();
for(int k=L;k<=R;k++)
ans=add(ans,count(k));
printf("%d\n",ans);
return ;
}
/*40分
#include<cstdio>
#include<cstring>
#define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
using namespace std;
const int N=1005;
const int mod=1e9+7;
int n,m,l,r,ans,f[N][N];
int main(){
FRE(xor);
scanf("%d%d%d%d",&n,&m,&l,&r);
n=n<<1|1;
for(int q=l;q<=r;q++){
memset(f,0,sizeof f);
f[0][0]=1;
for(int i=0;i<n;i++){
for(int j=0;j<=2*(m+q);j++){
if(f[i][j]){
for(int k=q;k<=(m+q);k++){
f[i+1][j^k]+=f[i][j];
f[i+1][j^k]%=mod;
}
}
}
}
ans+=f[n][0];
ans%=mod;
}
printf("%d\n",ans);
return 0;
}
*/

兔子的晚会 2016Vijos省选集训 day1的更多相关文章

  1. 股神小L 2016Vijos省选集训 day1

    股神小L (stock.c/pas/cpp)============================ 小L厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型 ...

  2. 串 2016Vijos省选集训 day3[AC自动机]

    1.串(string.c/.cpp/.pas) 限时1s,内存限制256MB,20个测试点 [题目描述] 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合S,然后它们定义一个字符串为“好”的,当 ...

  3. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  4. Luogu P5296 [北京省选集训2019]生成树计数

    Luogu P5296 [北京省选集训2019]生成树计数 题目链接 题目大意:给定每条边的边权.一颗生成树的权值为边权和的\(k\)次方.求出所有生成树的权值和. 我们列出答案的式子: 设\(E\) ...

  5. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  6. 国庆集训 Day1 T2 生成图 DP

    国庆集训 Day1 T2 生成图 现在要生成一张\(n\)个点的有向图.要求满足: 1.若有 a->b的边,则有 b->a 的边 2.若有 a->b 的边和 b->c 的边,则 ...

  7. 2019暑期金华集训 Day1 数据结构

    自闭集训 Day1 数据结构 CF643G 用类似于下面的方法,搬到线段树上. 如何合并两个集合?先全部放在一起,每次删掉最小的\(cnt_i\),然后把其他所有的\(cnt\)都减去\(cnt_i\ ...

  8. LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)

    LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...

  9. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

随机推荐

  1. Codeforces Round #467 (Div. 2) B. Vile Grasshoppers[求去掉2-y中所有2-p的数的倍数后剩下的最大值]

    B. Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. Topcoder SRM 144 DIV 1

    BinaryCode 模拟 题意是:定义串P,Q,其中Q[i]=P[i-1]+P[i]+P[i+1],边界取0,并且P必须是01串.现在给你Q,让你求出P. 做法是:枚举第一位是1还是0,然后就可以推 ...

  3. Rebound动画框架简单介绍

    Rebound动画框架简单介绍 Android菜鸟一枚,有不对的地方希望大家指出,谢谢. 最近在接手了一个老项目,发现里面动画框架用的是facebook中的Rebound框架,由于以前没听说过,放假时 ...

  4. many-to-one多对一属性说明

    通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联. 这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的 主键字段. <many-to-o ...

  5. LeetCode 290 Word Pattern(单词模式)(istringstream、vector、map)(*)

    翻译 给定一个模式,和一个字符串str.返回str是否符合同样的模式. 这里的符合意味着全然的匹配,所以这是一个一对多的映射,在pattern中是一个字母.在str中是一个为空的单词. 比如: pat ...

  6. Solr Cloud的搭建使用

    Solr的安装下载http://archive.apache.org/dist/lucene/solr/6.4.0/或者直接去官网下载最新版本网页指导 https://cwiki.apache.org ...

  7. docker selinux-enabled作用

    一.现象 在docker中有一个运行选项是selinux-enabled.这个选项的作用是啥? 简而言之,它提供了对docker容器中进程的selinux的控制支持.下面举例说明. 首先按照官方文档的 ...

  8. masm学习

    . .model flat,stdcall option casemap:none ; case sensitive ;http://www.popbook.com/wbbs/topic.asp?l_ ...

  9. js 简单getByClass得封装

    function getByClass(oParent,sClass){ var elems = oParent.getElementsByTagName("*"); var ar ...

  10. JAVA中大数经常使用的函数

    声明为 BigInteger 的 java.math 中的字段 static BigInteger BigInteger. ONE BigInteger 的常量 1. static BigIntege ...