CF156C Cipher
CF156C Cipher
首先可以发现,不管怎么操作,Ascll码的和是不变的
所以可以先dp出每种长度,每个Ascll码和的答案
即
f
[
i
]
[
j
]
表
示
长
度
为
i
,
A
s
c
l
l
码
和
为
j
的
方
案
数
f[i][j]表示长度为i,Ascll码和为j的方案数
f[i][j]表示长度为i,Ascll码和为j的方案数
预处理出来然后每次输出就好了
要注意减去原来的,即-1
#include<bits/stdc++.h>
#define mod 1000000007
#define N 105
using namespace std;
int f[N][26 * N], n;
char st[N];
int main() {
f[0][0] = 1;
for(int i = 1; i <= 101; i ++)
for(int j = i; j <= 26 * i; j ++)
for(int k = 1; k <= min(j, 26); k ++)
f[i][j] = (f[i][j] + f[i - 1][j - k]) % mod;
scanf("%d", &n);
while(n --) {
scanf("%s", st + 1);
int len = strlen(st + 1), ret = 0;
for(int i = 1; i <= len; i ++) ret += st[i] - 'a' + 1;
printf("%d\n", (f[len][ret] - 1 + mod) % mod);
}
return 0;
}