兔子的晚会 2016Vijos省选集训 day1

兔子的晚会 (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[1<<15],*fs,*ft;
    inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
    inline int read(){
        int x=0,rev=0,ch=getc();
        while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)rev=1;ch=getc();}
        while(ch>=‘0‘&&ch<=‘9‘){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getc();}
        return rev?-x:x;
    }
}using namespace IO;
namespace Operation{
    const int dydxh(int(1e9)+7);
    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=1;for(;b;b>>=1,a=mul(a,a))if(b&1)c=mul(c,a);return c;}
    inline int inv(int a){return pow(a,dydxh-2);}
}using namespace Operation;
const int MAXN(2000),D(48);
int n,m,L,R,ans,H,lim;
void init(){
    n=read()<<1|1,m=read(),L=read(),R=read();
    for(H=31;H>=0;H--)
        if(((m+R)>>H)&1)
            break;
    lim=1<<(++H);
}
int f[2048];
void FWT(int *f){
    for(int i=0;i<H;i++)
        for(int S=0;S<lim;S++)
            if(!((S>>i)&1)){
                int l=f[S],r=f[S|(1<<i)];
                f[S]=add(l,r),f[S|(1<<i)]=(l-r+dydxh)%dydxh;
            }
}
int count(int st){
    memset(f,0,sizeof f);
    for(int i=st;i<=st+m;i++)
        f[i]=1;
    FWT(f);
    for(int S=0;S<lim;S++)
        f[S]=pow(f[S],n);
    FWT(f);
    return mul(f[0],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 0;
}
/*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;
}
*/
时间: 2024-10-07 06:00:27

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

股神小L 2016Vijos省选集训 day1

股神小L (stock.c/pas/cpp)============================ 小L厌倦了算法竞赛,希望到股市里一展身手.他凭借自己还行的计算机功底和可以的智商,成功建立一个模型预测了一支股票接下来n天的价格. 我们把这支股票第i天的价格称为a_i.在接下来n天里,每一天小L可以选择花费a_i买入一股或者卖出一股从而获得a_i元收入. 当然小L卖出股票的时候,自己的账户上必须要有至少一股的剩余.现在小L希望知道,在n天过去之后,采取最优策略的情况下自己最多赚到多少钱. 注意

2016vijos 1-3 兔子的晚会(生成函数+倍增FWT)

求出序列的生成函数后,倍增FWT #include<cstdio> using namespace std; #define N 2048 const int mod=1e9+7; int inv; int f[N+1]; int Pow(int a,int b) { int res=1; for(;b;a=1LL*a*a%mod,b>>=1) if(b&1) res=1LL*res*a%mod; return res; } void FWT(int *a,int n) {

2017雅礼省选集训做题记录

嘛,最近在补雅礼省选前集训的题.都是我会做的题..那一定是最水的那些题啦 题目在loj.ac上都有.过段时间如果搬了雅礼NOI集训的题应该也会做做的吧.. Day1 T1 一道经典套路题,做法跟UOJ #228基础数据结构练习题类似. 使用线段树维护.考虑相邻两个数的差值最多变化log次.也就是说,对于每个区间,只要操作二进行大概log次就能使得这个区间内所有数完全一样.所以对于操作二,只要记录一下区间最大最小值,就能直接打标记或者暴力DFS下去. 和UOJ那个题一样,注意一个特殊情况,就是一个

雅礼集训——day1、day2

day1: 嗯上午考试拿了100分.第一题40,第二题60.看完题的时候我就觉得第二题的部分分是最好得到的,因为数据范围只有300,而且一眼看上去就是网络流的二分图多重匹配模型?然后就建了个网络流写了些,期望得分是70分,但是第1组数据有点劲,被卡掉了,就拿了60分.正解是map+set的贪心...并不会STL 写完T2去看T1,先用DFS乱搞了一下,结果样例都没过去,我手推了一下样例,得到了一个公式,就是从一个点出发需要加上的边数=这个点通过DFS能够遍历到的点的个数-与这个点直接相连的点的个

FJ省队集训DAY1 T1

题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会有交集,形如s0 s1 e0 e1 同样的,如果是n个点,那就是s0 s1 s2..sn e0 e1 e2.. en 因此,我们枚举那个起始点,然后对于其他点我们按照s排序,对于e做最长上升子序列即可.时间复杂度O(n^2 logn) 1 #include <cstdio> 2 #include

20150127 学军集训 day1

day1 就直接考试... 和说好的不一样啊 第一题看都没怎么看就pass了,构造的题我一向没什么把握.然后瞟到第三题有30分可做,虽然要写的代码很大...反正我是写习惯了..期间纠结了一会还写了一个没用的lct .. 写了3h 骗了30分 (' '      ) 然后第二题n^2log 由于堆太丑还t了... 就拿了40 分然后就回来了... 然后现在没看懂第一题怎么做的...第二题的kd tree 明天写, 第三题的lct + 可修改主席树虽然宏大但单写也不是特别的蛋疼(' '      )

长沙雅礼中学集训-------------------day1(内含day0)

day0: 首先,请允许我吐槽一下: 1.那些一个人住一个标准房的人您们真的是#@**¥&%--#*()%--*()@Q$&. 2.感谢那些一个人住一个标准间的人,要不然我们也找不到这个住宿完美,离学校贼进的宾馆. 3.经过一天的物价观察,我终于发现了如何将长沙的东西和焦作的相比从而得出贵不贵,你把价格除个二就差不多是焦作的价格了,如果价格一样的话请把东西的质量除以二. day1: 6:30起床顺便把懒虫高正从被窝里踹出来.然后那个懒虫就趁我洗漱的时候又睡了个回笼觉 没有摸清地点的我们傻不

SD 一轮集训 day1 carcar

可以发现每条边只能选一次或者两次,并且最后每个点的度数(∑邻接边选的次数和)都是偶数(代表有欧拉回路). 然后根据题意列一个 n 行 m+1 列的01矩阵,每一行代表一个异或方程组(每个点的度数是偶数),每一列(除了最后一列)代表一个变量(每条边是不是选2次),最后一列0/1代表这个点目前的度数是偶数还是奇数. 最后我们要求的就是方程所有解中逆字典序最小的解. 乍一看肯定是毫无思路,但是做了 [HAOI2018] 反色游戏 之后,就感觉这两个东西还是有点点共性的. 我们高斯消元的过程肯定是 i

省队集训Day1 总统选举

[题目大意] 一个$n$个数的序列,$m$次操作,每次选择一段区间$[l, r]$,求出$[l, r]$中出现超过一半的数. 如果没有超过一半的数,那么就把答案钦定为$s$,每次会有$k$个数进行改变,给出下标,改变成当前的答案$s$. $n, m \leq 5*10^5, \sum k\leq 10^6$ By FJSDFZ ditoly [题解] 用这题的方法进行线段树操作即可:http://www.cnblogs.com/galaxies/p/20170602_c.html 但是这样需要验