數論 DP 魔法陣

2021-08-21 09:57:54 字數 3536 閱讀 2043

帕秋莉·諾蕾姬,有著「不動的大圖書館」 的稱號,擅長使用各種各樣的屬性魔法。

——《東方求聞史記》

一如既往地,帕秋莉在圖書館中研究著魔法。今天,她在研究一本魔法書中的法陣。

這個法陣可以看成是按下面的規則生成乙個規模為n(n 為非負整數) 的圖形:

1. 在直角座標系xoy 中,畫4 條線段:[(0,0), (2^n,0)], [(0, 0), (-2^n, 0)],[(0, 0), (0, 2^n)], [(0, 0), (0,-2^n)]。

2. 對於所有的i = 1, 2, ……, n,畫兩個正方形,乙個以(0, 2^i), (0,-2^i),(2^i, 0), (-2^i, 0) 為頂點,另乙個以(-2^i-1,-2^i-1),(-2^i-1,2^i-1), (2^i-1,-2^i-1)(2^i-1,2^i-1) 為頂點。

3. 畫乙個以(1, 0), (-1, 0), (0,-1), (0, 1) 為頂點的正方形。

比如,當n = 0 時的法陣是這樣的:

當n = 2 時的法陣是這樣的:

帕秋莉已經畫出了這個巨大的法陣, 並且她能夠同時控制k 種不同的屬性元素。接下來,她要將這k 種元素分別依次灌注進法陣中的k 個不重疊不相交的三角形中,即這k 個三角形要灌注進不同的元素。這樣,這個法陣就會被啟用。

然而,灌注的方法有許多種。為了能最大限度地進行實驗,帕秋莉想把所有的方法都實驗一遍。而擺在她面前的問題是,總共有多少種不同的灌注方法呢?

注意,由於是法陣,看起來是中心對稱或軸對稱的兩個三角形,也是實質不等同的。或者說,假如兩個方案a 和b,只有通過旋轉、翻轉或二者組合才能使所有相同位置的三角形被灌注的元素相同,a 和b 仍然是不同的方案。只有本來所有相同位置的三角形被灌注的元素相同才算是相同的方案。

由於方法數會很大,帕秋莉只需要你輸出模1,000,000,007(10^9 + 7) 的結果就可以了。

input

輸入檔案magic.in。

一共一行兩個整數n,k,意義如題中所述。

output

輸出檔案magic.out。

一共一行乙個整數res,表示灌注方案數模1,000,000,007(109 + 7) 得到的結果。

sample input

輸入1:

0 0

輸入2:

0 1

輸入3:

0 2

輸入4:

1 1sample output

輸出1:

1 輸出2:

8 輸出3:

32 輸出4:

32data constraint

對於15% 的資料,k <= 1。

對於30% 的資料,k <= 2。

另外,有15% 的資料,滿足n <= 2。

對於100% 的資料,0<= n <= 200,0<= k <= min(200, 8n + 4)。

這題是真的奇妙

這題就是求不同構的方案數

我們定義三種三角形:

1、源三角形:三點中有一點是原點(0,0)

2、一級三角形:不包含任何其他三角形且不是源三角形的三角形

3、二級三角形:由兩個不重疊的一級三角形拼接成的三角形

然後對於n=0的情況,我們有這些:

然後再看其他n!=0的圖形,容易發現隱去內部結構以後,都可以轉換為n=0的情況,即所有圖形的最大源三角形方案數都是10個

然後我們再發現:對於n到n+1的轉移,源三角形向外擴張不可能多於n的時候(否則重複計算或不合法)

那麼我們考慮某乙個源三角形方案轉換成其他源三角形的方案數量,預處理好

然後我們再預處理出當你使用某源三角形方案時,一級三角形的最多個數和二級三角形的最多個數

狀態轉移方程顯而易見(別打我) f[

i+1]

[j+l

v1j+

lv2j

][l]

=(f[

i+1]

[j+l

v1j+

lv2j

][l]

+f[i

][j]

[k]×

to[k

][l]

×ct1

lv1j

×ct2

lv2j

)mod109

+7f [i

+1][

j+lv

1j+l

v2j]

[l]=

(f[i

+1][

j+lv

1j+l

v2j]

[l]+

f[i]

[j][

k]×t

o[k]

[l]×

clv1

jt1×

clv2

jt2)

mod109+

7然後顏色本身在三角形中排列的方式是pk

p

k,即最終答案為: k!

×∑i=

09f[

n][k

][0]

k !×

∑i=0

9f[n

][k][0]

#include 

#include

#define rep(i,a,b) for (i=a;i<=b;i++)

using namespace std;

typedef long long ll;

const ll mod=1e9+7;

int n,k;

ll f[201][801][10],c[13][13],ans;

ll to[10][10]=,,,

,,,,

,,};ll tr1[10]=,tr2[10]=;

int main()

f[0][0][0]=1;

f[0][1][1]=f[0][1][2]=4;

f[0][2][3]=4;f[0][2][4]=8;f[0][2][5]=f[0][2][6]=2;

f[0][3][7]=f[0][3][8]=4;

f[0][4][9]=1;

rep(i,0,n-1)

rep(j,0,k)

rep(l,0,9)

if (f[i][j][l])

rep(k,0,9)

if (to[l][k])

else break;

}rep(j,0,9) ans=(ans+f[n][k][j])%mod;

rep(j,1,k) ans=ans*j%mod;

printf("%lld",ans);

}

第2題 魔法陣

第2題 魔法陣 題目描述 昔有人,名斯凱利恩夫 盧克。其英文名乃skylynf luke。汝知之何名?曰實,吾亦不知。其有別號曰ylm。何?吾亦不知。汝宜喻之。其乃吾。他有乙個servant,叫做阿爾托莉雅 潘德拉貢,英文名是arturia pendragon,別名是saber。她的 誓約勝利之劍 ...

洛谷2119 魔法陣

標籤 數學,遞推,模擬 題目描述 六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。大魔法師有m個魔法物品,編號分別為1,2,m。每個物品具有乙個魔法值,我們用xi表示編號為i的物品的魔法值。每個魔法值xi是不超過n的正整數,可能有多個物品的魔法值相同。大魔法師認為,當且僅當...

NOIP2016普及 魔法陣

暴力列舉可以得65分 寫的稍微好一點可以得75分 先講講75分做法 用o m 2 的時間將以i開始的,在i後值為a j 的位置j加入鍊錶 每次需要找到a j 所在位置時,按照delta在鍊錶中查詢即可,時間可以忽略 因此是總時間複雜度o m 3 的。再講講滿分做法 用hash統計每個魔法值出現的次數...