羅区[5456] [THUPC2018]ケーキ(検索)

問題の表面を見るにはここをクリック

一般的な問題の意味: A \(\回\倍B \ C倍D \) \(4 \) -へ次元パターン\(\回\倍B \ \ C倍D) 見つけるための小ブロックを、\(0 \ sim8 \)各番号のブロック番号の表面に露出した面。

検索

一見すると、この問題は非常に神々が、これは数学が悪い私にとって、本当にでもサンプルを理解していないこんにゃくの想像力の欠如します。

しかし、実際には、限り掘り下げに良いとして\(3 \)次元グラフィックス、あなたは起動できます(\ 4)\次元グラフィック答えを。

一般的な考慮して、のための\(4 \)パターン寸法の各次元の、場合にのみ選択された最初の行またはこの次元の最後の行は、片面のみが複数の表面に露出している場合。

しかし、特定の状況、一行のみの、すなわち一次元の総あれば、我々はプラスの数にさらされる皮膚表面につながることが、見つけることができます\(2 \)

だから、私たちは、検索を書き、その後、特別な宣告行動の数\(1 \)の場合は、これが被写体になることができます。

最後に、奇妙な係数についてTucao。

コード

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define X 2148473648
#define LL long long
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int a[5];LL v[9];
I void dfs(CI x,Con LL& p,CI t)//搜索
{
    if(x==5) return (void)Inc(v[t],p);if(a[x]==1) return dfs(x+1,p,t+2);//统计答案;特判行数为1
    dfs(x+1,(a[x]-2)*p%X,t),dfs(x+1,2*p%X,t+1);//分两种情况继续搜索
}
int main()
{
    RI Tt;scanf("%d",&Tt);W(Tt--) scanf("%d%d%d%d",a+1,a+2,a+3,a+4),dfs(1,1,0),
        printf("%lld %lld %lld %lld %lld %lld %lld %lld %lld\n",v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]),
        v[0]=v[1]=v[2]=v[3]=v[4]=v[5]=v[6]=v[7]=v[8]=0;return 0;//注意清空
}

おすすめ

転載: www.cnblogs.com/chenxiaoran666/p/Luogu5456.html