給出兩個字串s和t,它們長度相等,都是由小寫字母『a』、『b』、『c』組成。每次操作,你可以對字串s進行如下操作之一:
1、 選擇s的乙個字元『a』,把該字元變成字元『b』,費用是cost[0]。
2、 選擇s的乙個字元『b』,把該字元變成字元『c』,費用是cost[1]。
3、 選擇s的乙個字元『c』,把該字元變成字元『a』,費用是cost[2]。
你的目標是把字串s變成t,但是總費用不能超過給定的maxcost,有多少種不同的操作方式?下面定義「不同的操作方式」:假設有兩種操作方式a和b,只要滿足如下兩種情況之一,就認為是「不同的操作方式」:
1、a和b的操作次數不同。
2、存在乙個整數k,在第k輪操作時,操作方式a是選擇第i個字元進行變化,而操作方式b是選擇第j個字元進行變化,且i不等於j。
woc真的是數論學傻了,連矩陣乘法裸題都不會了。
woc又發現連矩陣乘法的求和套路都忘了……
code:
#include
#include
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define fd(i, x, y) for(int i = x; i >= y; i --)
using
namespace
std;
const
int mo = 1e9 + 7;
char s[20], t[20];
int n, a[20], c[3], mx;
int num[20][20], tn;
ll b[200][200], e[200][200], d[200][200];
int main()
int g = mx / (c[1] + c[2] + c[0]);
fo(i, 0, n) fo(j, 0, n - i) num[i][j] = ++ tn;
fo(i, 0, n) fo(j, 0, n - i)
g *= 3; fo(i, 1, n) g += a[i];
tn ++; b[num[0][0]][tn] = 1; b[tn][tn] = 1;
fo(i, 1, tn) d[i][i] = 1;
g ++;
while(g)
fo(i, 1, tn) fo(j, 1, tn) e[i][j] = b[i][j], b[i][j] = 0;
fo(k, 1, tn) fo(i, 1, tn) fo(j, 1, tn) b[i][j] = (b[i][j] + e[i][k] * e[k][j]) % mo;
g /= 2;
}int p1 = 0, p2 = 0;
fo(i, 1, n)
printf("%lld", d[num[p1][p2]][tn]);
}
jzoj3252 GDOI三校聯考 炸彈
在乙個n行m列的二維網格裡,有些格仔是空地 用字元 表示 有些格仔是障礙物 用字元 表示 每個空地格仔都有乙隻蟲子,蟲子不會移動。fj打算用最少的炸彈把所有的蟲子消滅。fj每次可以選擇在乙個空地格仔 不妨假設是格仔a 放置乙個炸彈,這個炸彈 後,格仔a的蟲子會被消滅,假設有另乙個空地格仔b,如果空地...
jzoj3252 GDOI三校聯考 炸彈
在乙個n行m列的二維網格裡,有些格仔是空地 用字元 表示 有些格仔是障礙物 用字元 表示 每個空地格仔都有乙隻蟲子,蟲子不會移動。fj打算用最少的炸彈把所有的蟲子消滅。fj每次可以選擇在乙個空地格仔 不妨假設是格仔a 放置乙個炸彈,這個炸彈 後,格仔a的蟲子會被消滅,假設有另乙個空地格仔b,如果空地...
十二省聯考 字串問題
傳送門 顯然是建圖跑最長路一類的問題,我們需要將 字尾樹上對於點 而構造目標串的過程是 先選擇乙個 那麼隨便怎麼建一下圖就可以了。至於構造的目標串能否無限長,只需要看建出的圖有沒有環即可。務必用拓撲排序實現。spfa只有暴力分 code by uselessname pragma g optimiz...