CF1137 C.博物館ツアー
一般的に、通常の思考:ポイントを参照してくださいが、最初のグラフのアイデアに還元される(ただし、強いユニコムコンポーネントの波の個々の分析は全体にまとめることができることを証明するために、それが一般的であるエッジと頂点はその後、多くの貢献を通じて行くことができますこのタイプの一回のみカウントされます)\(DAG \) DP上で。
この質問は、時間制限より嫌な顔ので、一見あまりにも面倒です。
我々はポイントがに分割され、分割ポイントを考える(D \)\ A、\((I、J)\)を表す\(私は\)でポイント\を(J \)ユニコム状況日
この場合、我々は時間の減少を指して、我々は(博物館の営業時間中に、それに対応するどのように多くのポイントの強い中国聯通のすべてのコンポーネントに関する統計情報を持っている重量に注意を払います)
我々は中国聯通の各成分の重量の強力なポイントを得たように、この場合には、それが見えます
一見、残りはある\(DAG \)の最長チェーンの問題。
しかし、我々は貢献してきた強い中国聯通の2つの成分以上のポイントの場合を考慮していないようです
幸いにも、上記のシナリオが可能ではないので、考慮する必要はありません
なぜ?
我々は、満たすために、そのような経路が想定されていることを言う\ - ((I、X) >(I、Y)\) から、すなわち\(Iは\)の点(\ X)\に最初に到達する日\を(私は\)番目最初のポイント\(Y \)、私たちは日設定- (X \デルタD = Yの\)\を(デフォルトの\(Y \)がより大きいです\(X \) )
だから、そこにする必要があります\((I、0) - >(I、D - 1)\)
このようリマインダで、我々はからことがわかった\(のy \)にも達することができる(X- \)\その後、彼らは同じ強力なコンポーネントユニコムになり、
そして終了
私は、配列の変数預金側でスタック\(TOTの\は) REを狂気につながります
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
//const int N = 7;
const int mod = 1e9 + 7;
int a[9],b[9];
int dp[2][131][131];
int p[9];
int c[31][9];
int noip[9];
//0 =
//1:>
int n,m;
int now = 1;
inline void up(int &x,int y){
x += y;
if(x >= mod) x -= mod;
}
int main(){
p[0] = 1;
for(int i = 1;i <= n;++i) up(p[i],p[i - 1] << 1);
scanf("%d%d",&n,&m);
if(n == 1){printf("%d\n",p[m]);return 0;}
for(int i = 1;i <= n;++i) scanf("%d",&b[i]);
for(int i = 0;i < m;++i)
for(int j = 0;j < n;++j)
z[i][j] = (b[j] & (1 << i)) ? 1 : 0;
// for(int i = m;i >= 0;--i){
// for(int l = 0;l < (1 << (n - 1));++l){
// for(int r = 0;r < (1 << (n - 1));++r){
// for(int s = 0;s < (1 << n);++s){
//
// }
// }
// }
// }
//0 =
//1:>
int size1 = 1 << (n - 1);
int size2 = size1 << 1;
dp[0][0][0] = 1;
for(int i = m - 1;i >= 0;i--){
for(int l = 0;l < size1;++l){
for(int r = 0;r < size1;++r){
if(dp[now ^ 1][l][r] == 0) continue;
for(int s = 0;s < n;++s) if()
}
}
}
return 0;
}