题目描述

LYK喜欢字符串,它认为一个长度为n的字符串一定会有n*(n+1)/2个子串,但是这些子串是不一定全部都不同的,也就是说,不相同的子串可能没有那么多个。LYK认为,两个字符串不同当且仅当它们的长度不同或者某一位上的字符不同。LYK想知道,在字符集大小为k的情况下,有多少种长度为n的字符串,且该字符串共有m个不相同的子串。

由于答案可能很大,你只需输出答案对1e9+7取模后的结果即可。

输入格式(string.in)

一行3个数n,m,k。

输出格式(string.out)

一行,表示方案总数。

输入样例

2 3 3

输出样例

6

样例解释

共有6种可能,分别是ab,ac,ba,bc,ca,cb。

数据范围

对于20%的数据:1<=n,k<=5。

对于40%的数据:1<=n<=5,1<=k<=1000000000。

对于60%的数据:1<=n<=8,1<=k<=1000000000。

对于100%的数据:1<=n<=10,1<=m<=100,1<=k<=1000000000。

分析:很容易想歪的一道题.

   一开始想到dp,这要怎么dp呢?状压dp吗?状态不好用0/1表示......

   考虑到n很小,尝试搜索. 搜第i位的字符是哪一个?显然不行,字符集太大了. 其实不同子串的个数只与每个字符的相对大小有关.所以搜每一位的字符的相对大小即可.  如果最后搜出来的有k个不同相对大小的字符,答案乘上A(k,i)即可(排列数).

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; const ll mod = 1e9+; ll n,m,k,f[][][],vis[],tot,cnt,num[],a[],ans; void solve()
{
cnt = ;
tot = ;
memset(vis,,sizeof(vis));
for (int i = ; i <= n; i++)
{
if (!vis[num[i]])
{
tot++;
vis[num[i]] = ;
}
}
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
{
int r = i + j - ;
if (r > n)
break;
ll temp = ;
for (int k = j; k <= r; k++)
temp = temp * + num[k];
a[++cnt] = temp;
}
sort(a + ,a + + cnt);
cnt = unique(a + ,a + + cnt) - a - ;
f[n][cnt][tot]++;
} void dfs(int dep)
{
if (dep == n + )
{
solve();
return;
}
memset(vis,,sizeof(vis));
tot = ;
for (int i = ; i < dep; i++)
{
if (!vis[num[i]])
{
tot++;
vis[num[i]] = ;
}
}
num[dep] = tot + ;
dfs(dep + );
int flag[];
memset(flag,,sizeof(flag));
for (int i = ; i < dep; i++)
{
if (!flag[num[i]])
{
flag[num[i]] = ;
num[dep] = num[i];
dfs(dep + );
}
}
} ll A(ll x,ll y)
{
ll res = ;
for (ll i = ; i <= y; i++)
res = res * (x - i + ) % mod;
return res % mod;
} int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
dfs();
for (int i = ; i <= n; i++)
{
ans += f[n][m][i] * A(k,i) % mod;
ans %= mod;
}
printf(" %lld\n",ans % mod); return ;
}

最新文章

  1. 前端学HTTP之URL
  2. Apache commons-configuration setDelimiterParsingDisable不生效的处理
  3. POI读取Excel内容格式化
  4. [译]使用Continuous painting mode来分析页面的绘制状态
  5. C#实例
  6. hdu 4294 Multiple
  7. ee_15_mvc_db_page----demo---bai
  8. BrnMall多店版网上商城正式发布
  9. UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures&lt;Problem H&gt;
  10. linux中的strings命令简介
  11. Shortest path of the king
  12. 详谈C++虚函数表那回事(一般继承关系)
  13. 将sqlserver导出的csv数据导入到ubuntu和mac上的mysql
  14. 《C#手札》--基础知识
  15. Python学习(二十八)—— Django模板系统
  16. window下nginx负载均衡简单配置-----权重的实现
  17. tmux常用配置
  18. Spring boot注解(annotation)含义详解
  19. [py]约瑟夫问题-循环队列
  20. [Shiro] - shiro之SSM中的使用

热门文章

  1. 3星|《十大全球CEO亲授企业高速成长的关键战略》:作为CEO,我也非常坦率地表明过家庭优先于工作
  2. JavaScript学习笔记(五)——类型、转换、相等、字符串
  3. Blockchain For Dummies(IBM Limited Edition
  4. Codeforces Round #765 Div.1 F. Souvenirs 线段树
  5. Beta周第8次Scrum会议(11/17)【王者荣耀交流协会】
  6. 用VS测试程序
  7. 博弈--ZOJ 3084 S-Nim(SG)
  8. HDU 4747 Mex 递推/线段树
  9. Sqlserver学习研究
  10. Scrum 项目 5.0