一看好像会做的样子,就去做了一下,结果

猝不及防地T掉了

赶紧查了一下,没有死循环,复杂度也是对的,无果,于是翻了题解

题解没看懂,但是找到了标程,然后发现我被卡常了。。。

而且好像当时还过了前10个点啊。。这要真的是比赛稳稳的FST啊

小技巧:

逆元只需要求inv[i]和inv[i!],可以预处理出来

令md=1e9+7

则inv[1]=1

除此外inv[i]=(md-md/i)*inv[md%i]%md

令inv2[i]=inv[i!]

则inv2[n]=pow(n!,md-2)

除此外inv2[i]=inv2[i+1]*(i+1)%mod;

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#define md 1000000007
using namespace std;
typedef long long LL;
LL poww(LL a,LL b)
{
LL base=a,ans=;
while(b)
{
if(b&) ans=(ans*base)%md;
b>>=;
base=(base*base)%md;
}
return ans;
}
LL inv[],inv2[],jc[],sum,sumx,num[],ans,n;
char s1[],s2[];
void addx(LL x)
//num[x]++,同时维护sum,sumx
{
sum=sum*jc[num[x]]%md;
num[x]++;sumx++;
sum=sum*sumx%md;
sum=sum*inv2[num[x]]%md;
}
void delx(LL x)
{
sum=sum*jc[num[x]]%md;
sum=sum*inv[sumx]%md;#include
#include
#include
#include
#define md 1000000007
using namespace std;
typedef long long LL;
LL poww(LL a,LL b)
{
LL base=a,ans=1;
while(b)
{
if(b&1) ans=(ans*base)%md;
b>>=1;
base=(base*base)%md;
}
return ans;
}
LL inv[1000100],inv2[1000100],jc[1000100],sum,sumx,num[30],ans,n;
char s1[1000100],s2[1000100];
void addx(LL x)
//num[x]++,同时维护sum,sumx
{
sum=sum*jc[num[x]]%md;
num[x]++;sumx++;
sum=sum*sumx%md;
sum=sum*inv2[num[x]]%md;
}
void delx(LL x)
{
sum=sum*jc[num[x]]%md;
sum=sum*inv[sumx]%md;
sumx--;num[x]--;
sum=sum*inv2[num[x]]%md;
}
//s1的所有排列中小于s2的个数-s1的所有排列中小于s1的个数+1
int main()
{
LL i,j;
scanf("%s",s1+1);
scanf("%s",s2+1);n=strlen(s2+1);
jc[0]=1;
for(i=1;i<=1000000;i++) jc[i]=jc[i-1]*i%md;
inv[1]=1;
for(i=2;i<=1000000;i++) inv[i]=(md-md/i)*inv[md%i]%md;
for(i=0;i<=1000000;i++) inv2[i]=poww(jc[i],md-2);
for(i=1;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=0;i<26;i++) sum=sum*inv2[num[i]]%md;
for(i=1;i<=n;i++)
{
for(j=0;j<s2[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans+sum)%md;
addx(j);
}
if(num[s2[i]-'a']) delx(s2[i]-'a');
else break;
}
for(i=0;i<26;i++) num[i]=0;
for(i=1;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=0;i<26;i++) sum=sum*inv2[num[i]]%md;
for(i=1;i<=n;i++)
{
for(j=0;j<s1[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans-sum+md)%md;
addx(j);
}
if(num[s1[i]-'a']) delx(s1[i]-'a');
else break;
}
ans=(ans-1+md)%md;
printf("%lld",ans);
return 0;
} sumx--;num[x]--;
sum=sum*inv2[num[x]]%md;
}
//s1的所有排列中小于s2的个数-s1的所有排列中小于s1的个数+1
int main()
{
LL i,j;
scanf("%s",s1+);
scanf("%s",s2+);n=strlen(s2+);
jc[]=;
for(i=;i<=;i++) jc[i]=jc[i-]*i%md;
inv[]=;
for(i=;i<=;i++) inv[i]=(md-md/i)*inv[md%i]%md;
for(i=;i<=;i++) inv2[i]=poww(jc[i],md-);
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s2[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans+sum)%md;
addx(j);
}
if(num[s2[i]-'a']) delx(s2[i]-'a');
else break;
}
for(i=;i<;i++) num[i]=;
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s1[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans-sum+md)%md;
addx(j);
}
if(num[s1[i]-'a']) delx(s1[i]-'a');
else break;
}
ans=(ans-+md)%md;
printf("%lld",ans);
return ;
}

原来的代码(假的)

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#define md 1000000007
using namespace std;
typedef long long LL;
LL poww(LL a,LL b)
{
LL base=a,ans=;
while(b)
{
if(b&) ans=(ans*base)%md;
b>>=;
base=(base*base)%md;
}
return ans;
}
LL inv[],inv2[],jc[],sum,sumx,num[],ans,n;
char s1[],s2[];
void addx(LL x)
//num[x]++,同时维护sum,sumx
{
sum=sum*jc[num[x]]%md;
num[x]++;sumx++;
sum=sum*sumx%md;
sum=sum*inv2[num[x]]%md;
}
void delx(LL x)
{
sum=sum*jc[num[x]]%md;
sum=sum*inv[sumx]%md;
sumx--;num[x]--;
sum=sum*inv2[num[x]]%md;
}
//s1的所有排列中小于s2的个数-s1的所有排列中小于s1的个数+1
int main()
{
LL i,j;
scanf("%s",s1+);
scanf("%s",s2+);n=strlen(s2+);
jc[]=;
for(i=;i<=;i++) jc[i]=jc[i-]*i%md;
inv[]=;
for(i=;i<=;i++) inv[i]=(md-md/i)*inv[md%i]%md;
for(i=;i<=;i++) inv2[i]=poww(jc[i],md-);
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s2[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans+sum)%md;
addx(j);
}
if(num[s2[i]-'a']) delx(s2[i]-'a');
else break;
}
for(i=;i<;i++) num[i]=;
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s1[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans-sum+md)%md;
addx(j);
}
if(num[s1[i]-'a']) delx(s1[i]-'a');
else break;
}
ans=(ans-+md)%md;
printf("%lld",ans);
return ;
}

String Mark Codeforces - 895D的更多相关文章

  1. Codeforces 895.D String Mark

    D. String Mark time limit per test 4 seconds memory limit per test 256 megabytes input standard inpu ...

  2. String Typing CodeForces - 954B

    题意: 给一个字符串,可以复制某一段字符,问最少需要多少步能将其输出,比如abcabcd,先输入abc然后再赋值abc再输入d就只需要5步. 复制的这段字符 必须是从字符串的0位置开始复制的  而且只 ...

  3. Vasya and Binary String(来自codeforces

    题目大意: 给定一个0/1字符串,每次你可以将此字符串中一段连续的任意长度的0/1子串消除掉,注意每次消除的子串中只能有0或者1一种字符,消除掉一串长度为i的0/1字符串会得到a[i]的收益,问将这个 ...

  4. Playing with String(codeforces 305E)

    题意:刚开始你只有一个字符串每次能选择一个有的字符串 s,找到 i,满足s[i - 1] = s[i + 1],将其分裂成 3 个字符串s[1 · · · i - 1]; s[i]; s[i + 1 ...

  5. Codeforces #402

    目录 Codeforces #402 Codeforces #402 Codeforces 779A Pupils Redistribution 链接:http://codeforces.com/co ...

  6. Codeforces Round #300 A. Cutting Banner 水题

    A. Cutting Banner Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/pro ...

  7. Codeforces Round #448

    Pizza Serparation #include<stdio.h> #include<string.h> #include<stdlib.h> #include ...

  8. CodeForces - 999B Reversing Encryption

    B - Reversing Encryption A string s of length n can be encrypted by the following algorithm: iterate ...

  9. c++ hex string array 转换 串口常用

    c++ hex string array 转换 效果如下 tset string is follow 0x50 55 0x35 00 10 203040506073031323334ff format ...

随机推荐

  1. SharePoint中取得ACL和组中用户数量

     SharePoint中取得ACL和组中用户数量 1. 取得ACL的数量: select COUNT(ra.PrincipalId) as [Count],p.ScopeUrl from [WSS_C ...

  2. Cg入门6:函数2

    内建函数分为四类: 1.数学函数 2.几何函数 3.纹理函数 4.导数函数:事实上就是片段函数

  3. Jekyll 搭建

    Jekyll搭建个人主页 早上昨晚上弄hexo的时候就开始有问题,发现命令有错误!今天早上来就开始把另外建立了仓库,转Jekyll,并不顺利,做了一天了,基本的theme的本地和远端主页可以显示,但当 ...

  4. 使用WIN32汇编语言实现一个基本windows窗体的过程分析

    一个常规的windows窗体一般都是一些一样的构造.你假设想要更改一些个性化的设置,你能够在这个一般的模板伤添砖加瓦.构造自己比較喜欢的类型.下边就分析一下一般的windows窗体的一般模板. 一. ...

  5. 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自[我是干勾鱼的博客] 1 简单介绍 MySQL Workb ...

  6. 用Lazarus编写第一个程序Pascal版的hello world

    安装 Lazarus的过程不用多说,都是傻瓜式的. 打开Lazarus.Lazarus会自己主动新建一个窗体形式的应用程序. 你会看到五个窗体. 主窗体 这个窗体显示有标题栏.菜单条和工具栏. 对象视 ...

  7. Unity5的关卡切换

    本文章由cartzhang编写,转载请注明出处. 全部权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51055584 作者:car ...

  8. 列表和元组的基本操作,for遍历,range

    1,list(增删改查):列表可以装大量数据,不限制数据的类型(int,str,bool, list,tuple,dict,set),表示方法用[  ],list和sttr有区别,list可以直接在原 ...

  9. JavaScript对象(复习笔记)

    js对象 对象构造器 function person(firstname,lastname,age,eyecolor){ this.firstname=firstname; this.lastname ...

  10. rabbitmq kafka storm

    rabbitmq:实时消息传递 kafka:消息的持久化 storm:使用拓扑逻辑进行