牛客 [NCT058B]清新题

给定 \(n,m\),求有多少对长度为 \(n\) 的序列 \(a,b\) 合法。
两个序列 a,ba,ba,b 合法被定义为 :

\(∀i,ai,bi∈[0,2m).a_1|a_2|\cdots|a_n\geqslant b_1\oplus b_2\oplus \cdots b_n~,~\forall i,a_i,b_i\in [0,2^m)\)

其中 \(|\) 表示按位或,\(\oplus\) 表示按位异或。

输入描述:

两个以空格分隔的正整数 \(n,m.\)

输出描述:

一个非负整数,表示答案对 \(10^9 + 7\) 取模后的值。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e6+5,mod=1e9+7;
#define int long long
inline int ksm(int x,int y){
	int ans=1;
	while(y){
		if(y&1)ans=ans*x%mod;
		x=x*x%mod; y>>=1;
	}
	return ans;
}
signed main(){
	int n,m;
	cin>>n>>m;
	int res=0,lst=1;
	for(int i=1;i<=m;i++){
		int A=ksm(2,n);
		A=(A-1+mod)%mod;
		int B=ksm(2,n-1);
		
		int op=ksm(2,2*n*(m-i));

		res=(res+A*B%mod*lst%mod*op%mod)%mod;
		
		lst=lst*((A*B%mod+B)%mod)%mod;
	}
	res=(res+lst)%mod;
	cout<<res<<endl;
}
posted @ 2022-03-26 17:57  白木偶君  阅读(52)  评论(0编辑  收藏  举报