GDOI2018模擬7 12 B 矩陣乘法 dp

2021-08-03 18:02:06 字數 1287 閱讀 1671

description

給定乙個3*3的網格圖,一開始每個格仔上都站著乙個機械人。每一步機械人可以走到相鄰格仔或留在原地,同乙個格仔上可以有多個機械人。問走n步後,有多少種走法,滿足每個格仔上都有機械人。答案對10^9+7取模。

input

output

這題是個大水但是我由於沉迷第一題無法自拔導致沒有切= =

設f[i][j]表示從i走到j的方案數,一開始先預處理走一步的,然後我乘以n次,就是走n步的方案數,然後9!列舉每乙個位置上的機械人原來在**(編號),然後就可以了。

#include

#include

#include

#include

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

#define fd(i,a,b) for(int i=a;i>=b;i--)

using

namespace

std;

const

int n=1e5+5;

const

int mo=1e9+7;

typedef

long

long ll;

ll n;

int ans,f[20][20];

const

int dx[4]=;

const

int dy[4]=;

bool vis[10];

int t[10];

struct matrix

inline

void clear()

}a;inline

int trans(int x,int y)

inline

void mul(matrix &c,matrix a,matrix b)

}inline matrix pow(matrix x,ll b)

return ans;

}inline

int calc()

inline

void dfs(int x)

fo(i,1,9)

if (!vis[i])t[x]=i,vis[i]=1,dfs(x+1),vis[i]=0;

}int main()

}a=pow(a,n);

fo(i,1,9)

fo(j,1,9)

f[i][j]=a.a[i][j];

dfs(1);

printf("%d\n",ans);

return

0;}

GDOI2018模擬7 8 質數

將1 n分成盡可能小的集合,使得每個集合的元素均為質數 乙個數n n 6000 第一行乙個數m表示分成幾塊 第二行n個1 m的數表示每個數分到哪一塊 2 1 2 2 1 1 1 1 2 這題很有趣 我們知道有個哥德 猜想 任意乙個足夠大的偶數可以分成兩個質數的和 由於目前人類沒有證明出它是錯的,而且...

GDOI2018模擬8 11 決戰

聽說暴力狀壓可以過?然而我常數不好只有90分 考慮普通的狀壓,f i s j 表示當前填到第i行,第i行的狀態為s,用了j個哲學 家的方案數 我們把最後一維看做多項式,用x j的係數表示答案 咦?模數是998244353哦,那我們是不是可以用ntt加速呢?如果我們求出對於所有wi 答案的多項式的點值...

GDOI2018模擬8 14 神奇的矩陣

輸出一行表示答案 3 3 2 1 2 3 4 5 6 7 8 9 真是神奇的一道題 為了避免絕對值的影響,讓每個數字從小到大加入,對於每個數字考慮貢獻 設f i j 表示以 i,j 為左上角的k k的矩陣中有數的個數 那麼乙個數在加入時,所有包括它的k k矩陣的f的和,就是這個數對答案做的正貢獻 那...