标签:表达 std 如何 long 表示 还需 false 位操作 题目
题目描述
3 2
16
#include<iostream> using namespace std; int n,m,cnt; int a[1100],sum[1100]; long long f[11][1100][105]; int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=0;i<(1<<n);i++){ if(i&(i<<1)||i&(i>>1)) continue; a[++cnt]=i; int x=i; while(x) sum[cnt]+=x&1,x>>=1; //sum表示数字i的二进制表达下有几个1。 } for(int i=1;i<=cnt;i++) f[1][i][sum[i]]=1; for(int i=2;i<=n;i++){ for(int j=1;j<=cnt;j++){ for(int k=1;k<=cnt;k++){ if(a[j]&a[k]||(a[j]>>1)&a[k]||(a[j]<<1)&a[k]) continue; //表示上一个状态和这一个状态这两种情况是否合法 for(int l=sum[j]+sum[k];l<=m;l++){ f[i][j][l]+=f[i-1][k][l-sum[j]]; } } } } long long ans=0; for(int i=1;i<=cnt;i++){ ans+=f[n][i][m]; } cout<<ans; }
谢谢阅读
标签:表达 std 如何 long 表示 还需 false 位操作 题目
原文地址:https://www.cnblogs.com/tianbowen/p/11335477.html