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)
{
    int x,y;
    for(int d=1;d<n;d<<=1)
        for(int m=d<<1,i=0;i<n;i+=m)
            for(int j=0;j<d;++j)
            {
                x=a[i+j]; y=a[i+j+d];
                a[i+j]=x+y; a[i+j+d]=x-y;
                a[i+j]-=a[i+j]>=mod ? mod : 0;
                a[i+j+d]+=a[i+j+d]<0 ? mod : 0;
            }
}

void IFWT(int *a,int n)
{
    int x,y;
    for(int d=1;d<n;d<<=1)
        for(int m=d<<1,i=0;i<n;i+=m)
            for(int j=0;j<d;++j)
            {
                x=a[i+j]; y=a[i+j+d];
                a[i+j]=1LL*(x+y)*inv%mod; a[i+j+d]=1LL*(x-y+mod)%mod*inv%mod;
            }
}

int main()
{
    //freopen("xor.in","r",stdin);
    //freopen("xor.out","w",stdout);
    int n,m,L,R;
    scanf("%d%d%d%d",&n,&m,&L,&R);
    n=2*n+1;
    inv=Pow(2,mod-2);
    int len;
    int ans=0;
    for(int x=L;x<=R;++x)
    {
        len=1;
        while(len<=x+m) len<<=1;
        for(int i=0;i<x;++i) f[i]=0;
        for(int i=x;i<=x+m;++i) f[i]=1;
        for(int i=x+m+1;i<len;++i) f[i]=0;
        FWT(f,len);
        for(int i=0;i<len;++i) f[i]=Pow(f[i],n);
        IFWT(f,len);
        ans+=f[0];
        ans-=ans>=mod ? mod : 0;
    }
    printf("%d",ans);
}

原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8954408.html

时间: 2024-07-31 07:34:26

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

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

兔子的晚会 (xor.c/pas/cpp)============================= 很久很久之前,兔子王国里居住着一群兔子.每到新年,兔子国王和他的守卫总是去现场参加晚会来欢庆新年. 在新年晚会上,兔子国王和他的守卫们坐在观众席的第一排,兔子国王坐在这排最中间的位置,然后国王两边各坐有恰好相同数目的n个守卫, 我们按照第一排从左到右的顺序为国王和守卫分别编号为1到2*n+1. 在晚会上,兔子们的脸上都洋溢着幸福的笑容,兔子国王为了量化自己和守卫们的幸福度,就将晚会开始时,为第i

【BZOJ 3551】[ONTAK2010] Peaks加强版 Kruskal重构树+树上倍增+主席树

这题真刺激...... I.关于Kruskal重构树,我只能开门了,不过补充一下那玩意还是一棵满二叉树.(看一下内容之前请先进门坐一坐) II.原来只是用树上倍增求Lca,但其实树上倍增是一种方法,Lca只是他的一种应用,他可以搞各种树上问题,树上倍增一般都会用到f数组. |||.我们跑出来dfs序就能在他的上面进行主席树了. IV.别忘了离散. V.他可能不连通,我一开始想到了,但是我觉得出题人可能会是好(S)人(B),但是...... #include <cstdio> #include

【BZOJ 3028】 3028: 食物 (生成函数)

3028: 食物 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 569  Solved: 382 Description 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险! 我们暂且不讨论他有多么NC,他又幻想了他应该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数. 他这次又准备带一些受欢迎的食物,如:蜜桃多啦,鸡块啦,承德汉堡等等 当然,他又有一些稀奇古怪的限制: 每种食物的限制如下: 承德汉堡:偶数个 可乐:0个或1

BZOJ 3028 食物 ——生成函数

把所有东西的生成函数搞出来. 发现结果是x*(1-x)^(-4) 然后把(1-x)^(-4)求逆,得到(1+x+x^2+...)^4 然后考虑次数为n的项前的系数,就相当于选任意四个非负整数构成n的方案数. 大概就是C(n+3,3) 前面还有一项是x,所以n--即可. 然后就A掉了. #include <cstdio> #include <cstring> #define ll long long const int inv=1668; const int md=10007; in

递归函数____斐波拉契数列____出生2个月后小兔子可以生小小兔子

2017-09-17 22:41:44 递归     ____函数自己调用自己,又可以理解为自己的事情自己做.    如果觉得难以理解,可以把理解成这个函数调用了一个函数,只是这个函数和自己长得一模一样. ---------------------------------------------------------------------------------------     拿一对刚出生的小兔子编故事.     假设,一对刚出生的小兔子,第一个月没有繁殖能力,两个月后生下一对兔子.

【NOIP2012提高组】开车旅行 倍增

题目分析 朴素的做法就是预处理下一个目的地,然后跑模拟,超时. 本题最重要的考点是倍增优化.设$fa[i][j]$表示a从i出发行驶$2^j$“次”后行驶的路程,$fb[i][j]$表示从i出发行驶$2^j$“次”后行驶的路程,注意这里的"次",a.b交替行驶.$f[i][j]$表示从i出发a.b交替$2^j$“次”后行驶到的城市编号. 显然有$fa[i][j] = fa[i][j - 1] + fa[f[i][j - 1]][j - 1], fb = fb[i][j - 1] + f

【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络.该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信. 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略.但是由于路由器老化,在这些

bzoj1001 [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23723  Solved: 5981[Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M

4444: [Scoi2015]国旗计划|贪心|倍增

由于没有区间被其它区间包括这个条件,也就是假设li<lj那么一定满足ri<rj,就能够贪心搞一搞了. 假如区间[l,r]都已经被覆盖,那么能够继续找一个li在[l,r]范围内的最大的一个,继续扩展覆盖的区间,然后再以相同的方式找下一个战士 这样能够依照左端点排序,然后每个战士要找的下一个战士都是确定的,然后用倍增找出一共须要多少战士就能够了 #include<algorithm> #include<iostream> #include<cstdlib> #i