$\newcommand{\align}[1]{\begin{align*}#1\end{align*}}$题意:对于一个序列$a_{1\cdots n}(a_i\in[1,2^k-1])$,定义序列$b_{1\cdots n}$满足$b_i=a_1|\cdots|a_i$,这里的“$|$”是按位或,问有多少种可能的$a_{1\cdots n}$使得$b_{1\cdots n}$严格单调递增

首先,$a$每增加一个数,这个数必须有一个二进制位是前面所有数都没有出现过的,所以当$n\gt k$时是没有解的,那个$n\leq10^{18}$是在吓人

然后考虑DP,设$f_{i,j}$为$a$有$i$个数且这些数的或占了$j$个二进制位(占位不考虑顺序),那么答案为$\align{\sum\limits_{i=n}^k\binom kif_{n,i}}$(统计答案的时候就要考虑顺序了)

考虑如何转移,我们有$\align{f_{x+y,i}=\sum\limits_{j=0}^i\binom ijf_{x,j}\left(2^j\right)^yf_{y,i-j}}$(前$x$个数占据哪$j$位,后$y$个数必须占$i-j$位,后$y$个数的其他$j$位可以随便取),整理一下得到$\align{\dfrac{f_{x+y,i}}{i!}=\sum\limits_{j=0}^i\dfrac{f_{x,j}2^{yj}}{j!}\dfrac{f_{y,i-j}}{(i-j)!}}$,这是卷积的形式,并且第一维下标也是相加的形式,所以可以直接快速幂+FFT求得答案

可是模数是$10^9+7$...毒瘤出题人

所以学习了一发拆系数FFT:在模$p$意义下,我们可以选取一个$M\geq\left\lceil\sqrt p\right\rceil$,并且把每个系数表达为$aM+b$的形式(这时$a,b\leq M$,因为数字变小了所以爆精度的风险低一些),把每个多项式拆成两个多项式,稍微推下式子就可以做到用$7$次FFT完成任意模数卷积,注意合并系数时适当模一下防止爆$\text{long long}$

然后就做完了,感觉此题略神==

#include<stdio.h>
#include<math.h>
#include<string.h>
typedef long long ll;
typedef double du;
const int mod=1000000007;
int mul(int a,int b){return a*(ll)b%mod;}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
struct complex{
	du x,y;
	complex(du a=0,du b=0){x=a;y=b;}
};
complex operator+(complex a,complex b){return complex(a.x+b.x,a.y+b.y);}
complex operator-(complex a,complex b){return complex(a.x-b.x,a.y-b.y);}
complex operator*(complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void swap(complex&a,complex&b){
	complex c=a;
	a=b;
	b=c;
}
int rev[65536],N;
complex w[16][65536];
void pre(int n){
	int i,j,k;
	for(N=1,k=0;N<n;N<<=1)k++;
	for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
	k=0;
	for(i=2;i<=N;i<<=1){
		for(j=0;j<i;j++)w[k][j]=complex(cos(j*M_PI/(i/2)),sin(j*M_PI/(i/2)));
		k++;
	}
}
void fft(complex*a,int on){
	int i,j,k,f;
	complex t,wi;
	for(i=0;i<N;i++){
		if(i<rev[i])swap(a[i],a[rev[i]]);
	}
	f=0;
	for(i=2;i<=N;i<<=1){
		for(j=0;j<N;j+=i){
			for(k=0;k<i>>1;k++){
				wi=w[f][k];
				wi.y*=on;
				t=wi*a[i/2+j+k];
				a[i/2+j+k]=a[j+k]-t;
				a[j+k]=a[j+k]+t;
			}
		}
		f++;
	}
	if(on==-1){
		for(i=0;i<N;i++)a[i].x/=N;
	}
}
complex A[65536],B[65536],C[65536],D[65536];
void mul(int*a,int*b,int n){
	int i;
	complex t;
	for(i=0;i<N;i++){
		A[i]=a[i]>>15;
		B[i]=a[i]&32767;
		C[i]=b[i]>>15;
		D[i]=b[i]&32767;
	}
	fft(A,1);
	fft(B,1);
	fft(C,1);
	fft(D,1);
	for(i=0;i<N;i++){
		t=A[i]*D[i]+B[i]*C[i];
		A[i]=A[i]*C[i];
		C[i]=B[i]*D[i];
		B[i]=t;
	}
	fft(A,-1);
	fft(B,-1);
	fft(C,-1);
	memset(a,0,(n+1)<<2);
	for(i=0;i<=n;i++)a[i]=((llround(A[i].x)%mod<<30)+(llround(B[i].x)%mod<<15)+llround(C[i].x)%mod)%mod;
}
int ta[65536];
void trans(int*a,int*b,int n,int p){
	int i,t;
	memset(ta,0,sizeof(ta));
	t=1;
	for(i=0;i<=n;i++){
		ta[i]=mul(a[i],t);
		t=mul(t,p);
	}
	mul(ta,b,n);
	memcpy(a,ta,sizeof(ta));
}
int fac[30010],rfac[30010];
int binom(int n,int k){return mul(fac[n],mul(rfac[k],rfac[n-k]));}
int f[65536],g[65536];
int main(){
	ll n;
	int k,i,b,ans;
	scanf("%I64d%d",&n,&k);
	if(n>k){
		putchar('0');
		return 0;
	}
	fac[0]=1;
	for(i=1;i<=k;i++)fac[i]=mul(fac[i-1],i);
	rfac[k]=pow(fac[k],mod-2);
	for(i=k;i>0;i--)rfac[i-1]=mul(rfac[i],i);
	for(i=1;i<=k;i++)f[i]=rfac[i];
	g[0]=1;
	pre(k<<1|1);
	b=2;
	while(n){
		if(n&1)trans(g,f,k,b);
		trans(f,f,k,b);
		b=mul(b,b);
		n>>=1;
	}
	ans=0;
	for(i=n;i<=k;i++)ans=(ans+mul(mul(g[i],fac[i]),binom(k,i)))%mod;
	printf("%d",(ans+mod)%mod);
}

[CF623E]Transforming Sequence的更多相关文章

  1. BZOJ 5381 or & Codeforces 623E Transforming Sequence DP+NTT

    两道题题意都是一样的 不过$CF$的模数是$10^9+7$ 很简单的分析发现$A_i$项一定要有一个之前没有出现过的二进制位才能满足条件 考虑$DP$来做 设$f_{i,j}$表示$i$个数用了二进制 ...

  2. CodeForces 623E Transforming Sequence 动态规划 倍增 多项式 FFT 组合数学

    原文链接http://www.cnblogs.com/zhouzhendong/p/8848990.html 题目传送门 - CodeForces 623E 题意 给定$n,k$. 让你构造序列$a( ...

  3. 【codeforces 623E】 Transforming Sequence

    http://codeforces.com/problemset/problem/623/E (题目链接) 题意 长度为${n}$的满足前缀按位或为单调递增的${k}$位序列.要求每个位置为${[1, ...

  4. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  5. FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ

    因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...

  6. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  7. CF623

    AIM Tech Round (Div. 1) <br > 这真是一套极好的题目啊.....虽然我不会做 <br > 代码戳这里 <br > A.Graph and ...

  8. FFT/FWT

    最近舟游疯狂出货,心情很好~ FFT FWT 快速傅里叶变换(FFT) 具体的推导见这篇:胡小兔 - 小学生都能看懂的FFT!!! (写的很好,不过本小学生第一次没看懂0.0) 总结下关键内容 ~ P ...

  9. Note -「多项式」基础模板(FFT/NTT/多模 NTT)光速入门

      进阶篇戳这里. 目录 何为「多项式」 基本概念 系数表示法 & 点值表示法 傅里叶(Fourier)变换 概述 前置知识 - 复数 单位根 快速傅里叶正变换(FFT) 快速傅里叶逆变换(I ...

随机推荐

  1. Singleton patterns 单件(创建型模式)

    1.模式分类 1.1  从目的来看: •      – 创建型(Creational)模式:负责对象创建. •      – 结构型(Structural)模式:处理类与对象间的组合. •      ...

  2. install.cloudinit.qga.bat

    @echo off title Auto Install color 1F ::CloudBase-Init echo. msiexec /i \\192.168.122.47\cloudbase\C ...

  3. 【志银】#define lowbit(x) ((x)&(-x))原理详解

    分析下列语句 #define lowbit(x) ((x)&(-x)) 可写成下列形式: int Lowbit(x) { return x&(-x); } 例1:x = 1 十进制转二 ...

  4. 容器基础(二): 使用Namespace进行边界隔离

    Linux Namespace 容器技术可以认为是一种沙盒(sandbox), 为了实现沙盒/容器/应用间的隔离,就需要一种技术来对容器界定边界,从而让容器不至于互相干扰.当前使用的技术就是Names ...

  5. springboot09 事务 H2数据库

    一.事务 1. 事务介绍 事务可以包含多个操作步骤 , 如果有一个步骤失败,那么这一组都以失败告终. 事务是指包含多个微小逻辑单元的一组操作, 只要其中有一个逻辑失败了,那么这一组操作就全部以失败告终 ...

  6. 软工实践 - 第十三次作业 Alpha 冲刺 (4/10)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/9980005.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去 ...

  7. Scala 基础(1)—— 定义变量 & 定义函数

    1. 使用 val & var 定义变量 Scala 中的变量被分为2种:val 和 var.其含义于 Java 中的 final 关键字类似. val 等同于被 final 修饰过的变量, ...

  8. [AT2699]Flip and Rectangles

    题目大意:有一个$n\times m$的$01$矩阵,可以把任意行或列反转,问最大的全为一的子矩阵的面积 题解:有一个结论:若一个子矩形$S$中的任意一个$2\times 2$的子矩形都含有偶数个$1 ...

  9. 【POJ 2387 Til the Cows Come Home】

    Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 59755Accepted: 20336 Description Bessie is ...

  10. 刷题总结——Aeroplane chess(hdu4405)

    题目: Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 grids labele ...