题解 CF156C Cipher

容易发现,如果把字母表映射到 [1,26] 上,那么无论怎么操作总和都不变。

于是可已将问题转化为:有多少种长度为 n 的序列,满足每个元素在 [1,26] 之间,总和为 sum

定义 fi,j 表示处理到第 i 个元素,总和为 j 的合法方案数。

转移方程为 fi,j=k=126fi1,jk,其中 f0,0=1

复杂度 O(n2262)

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100+5,mod=1e9+7;
ll T,f[N][27*N];
string s;
int main(){
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>T;
  f[0][0]=1;
  for(int i=1;i<=100;++i){
    for(int j=1;j<=2600;++j){
      for(int k=1;k<=min(26,j);++k){
        f[i][j]=(f[i][j]+f[i-1][j-k])%mod;
      }
    }
  }
  while(T--){
    cin>>s;
    ll sum=0,len=s.size();for(int i=0;i<len;++i)sum+=s[i]-'a'+1;
    cout<<f[len][sum]-1<<endl;
  }
  return 0;
}

本文作者:HQJ2007

本文链接:https://www.cnblogs.com/HQJ2007/p/17561355.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   HQJ2007  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起