牛客 [NCT058B]清新題
阿新 • • 發佈:2022-03-26
給定 \(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; }