题目

给出一个长度为n, 由小写英文字母组成的字符串S, 求在所有由小写英文字母组成且长度为n 且恰好有k 位与S 不同的字符串中,给定字符串T 按照字典序排在第几位。

由于答案可能很大,模10^9 + 7 输出。

分析

我们从小到大枚举i,

假设1i-1位都是等于T的1i-1位,那么第i位就要小于T[i],

然后在保证不用的个数等于k的情况下,i+1~n位就可以随便选。

细节很多,小心处理。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const long long mo=1000000007;
const int N=100005;
using namespace std;
long long k,n,a[N],d[N],jc[N],ny[N],ans=1;
bool q;
char s2[N],s1[N];
long long mi(long long x,long long y)
{
long long sum=1;
while(y)
{
if(y&1) sum=sum*x%mo;
x=x*x%mo;
y/=2;
}
return sum;
}
long long c(int x,int y)
{
return jc[x]*ny[y]%mo*ny[x-y]%mo;
}
int pre()
{
jc[0]=1;
for(int i=1;i<=N;i++)
{
jc[i]=jc[i-1]*i%mo;
ny[i]=mi(jc[i],mo-2);
}
ny[0]=ny[1];
d[0]=1;
for(int i=1;i<=N;i++) d[i]=d[i-1]*25%mo;
}
int main()
{
pre();
scanf("%lld%lld",&n,&k);
scanf("%s",s1+1);
scanf("%s",s2+1);
for(int i=1;i<=n;i++)
{
a[i]=a[i-1];
if(s1[i]!=s2[i]) a[i]++;
}
for(int i=1;i<=n;i++)
if(s1[i-1]==s2[i-1])
q=true;
for(int i=1;i<=n;i++)
{
if(s1[i]==s2[i])
{
(ans+=(s2[i]-'a')*d[k-1]%mo*c(n-i,k-1)%mo)%mo;
}
else
if(s1[i]<s2[i])
{
(ans+=((s2[i]-'a'-1)*d[k-1]%mo*c(n-i,k-1)%mo)%mo)%mo;
if(k<=n-i) ans=(ans+d[k]*c(n-i,k)%mo)%mo;
k--;
}
else
if(s2[i]<s1[i])
{
(ans+=(s2[i]-'a')*d[k-1]%mo*c(n-i,k-1)%mo)%mo;
k--;
}
}
cout<<ans%mo<<endl;
}

最新文章

  1. Unity Standard Assets 简介之 Characters
  2. 对jQuery ajax三级级联的简单研究
  3. JSP中的Servlet及Filter
  4. window.parent与window.openner区别介绍
  5. FAQ: Machine Learning: What and How
  6. 如何获取域名(网址)对应的IP地址
  7. Android与PHP服务器交互
  8. ARM MIPS PowerPC比较
  9. 使用微信api接口开发的框架
  10. WCF X.b 操作引用了已经从 Y.b 操作导出的消息元素 [http://tempuri.org/:b]。可以通过更改方法名称或使用 OperationContractAttribute 的 Name 属性更改其中一个操作的名称...
  11. JAVA8,SPRING,ANGULARJS对项目
  12. c# 数据库更新操作-文本更新和数值更新小差别
  13. MySQL批量导出以某数字或字母开头的表
  14. Selenium+java+idea的安装与配置
  15. 运行web项目端口占用问题
  16. java 随机数高效生成
  17. Y1O001波分复用器
  18. SpringBoot系列: Spring MVC视图方法的补充
  19. Hbase记录-Hbase shell使用命令
  20. 运行B/s项目时,出现尝试访问类型与数组不兼容元素问题?

热门文章

  1. Java中集合关键字的区别
  2. python 并发编程 协程 协程介绍
  3. excel常用公式--计算统计类
  4. neo4j3.0多数库切换
  5. [转帖]/proc/sys/net/ipv4/ 下参数理解
  6. idea常用快捷键列表
  7. Anaconda配置环境变量+创建虚拟环境+pycharm使用虚拟环境
  8. [MtOI2019]永夜的报应 题解
  9. java tomcat服务器
  10. Python time strptime()方法 时间操作