String Mark Codeforces - 895D
一看好像会做的样子,就去做了一下,结果
猝不及防地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的更多相关文章
- Codeforces 895.D String Mark
D. String Mark time limit per test 4 seconds memory limit per test 256 megabytes input standard inpu ...
- String Typing CodeForces - 954B
题意: 给一个字符串,可以复制某一段字符,问最少需要多少步能将其输出,比如abcabcd,先输入abc然后再赋值abc再输入d就只需要5步. 复制的这段字符 必须是从字符串的0位置开始复制的 而且只 ...
- Vasya and Binary String(来自codeforces
题目大意: 给定一个0/1字符串,每次你可以将此字符串中一段连续的任意长度的0/1子串消除掉,注意每次消除的子串中只能有0或者1一种字符,消除掉一串长度为i的0/1字符串会得到a[i]的收益,问将这个 ...
- Playing with String(codeforces 305E)
题意:刚开始你只有一个字符串每次能选择一个有的字符串 s,找到 i,满足s[i - 1] = s[i + 1],将其分裂成 3 个字符串s[1 · · · i - 1]; s[i]; s[i + 1 ...
- Codeforces #402
目录 Codeforces #402 Codeforces #402 Codeforces 779A Pupils Redistribution 链接:http://codeforces.com/co ...
- Codeforces Round #300 A. Cutting Banner 水题
A. Cutting Banner Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/pro ...
- Codeforces Round #448
Pizza Serparation #include<stdio.h> #include<string.h> #include<stdlib.h> #include ...
- CodeForces - 999B Reversing Encryption
B - Reversing Encryption A string s of length n can be encrypted by the following algorithm: iterate ...
- c++ hex string array 转换 串口常用
c++ hex string array 转换 效果如下 tset string is follow 0x50 55 0x35 00 10 203040506073031323334ff format ...
随机推荐
- html5摇一摇代码优化
首先对DeviceMotionEvent进行优化: 去除没用的代码,又一次封装DeviceMotionEven if(window.DeviceMotionEvent) { var speed = 2 ...
- Nerv --- React IE8 兼容方案
创建项目 创建一个目录,使用npm快速初始化 $ mkdir my-project && npm init -y 安装依赖 安装webpack以及babel $ npm install ...
- SQL - 创建一个学生表,要求有主键约束和非空约束
CREATE TABLE [dbo].[Student] ( [ID] [int] NOT NULL, [Name] [nchar](10) NOT NULL, [Age] [int] NOT NUL ...
- 怎样更好的设计你的REST API之基于REST架构的Web Service设计及REST框架实现
一.REST 含状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格. 眼下在 ...
- 解决pycharm下安装reportLab报错的问题
在利用pycharm中自带的第三方安装工具安装reportLab时提示安装失败.失败的原因是缺失第三方扩展包.经过查阅查阅资料了解到一些python的第三方扩展包是需要python-dev支持的.我装 ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- ssh配置无password登录
前提.机器A,B,均为RedHat Linux操作系统,均实用户user 1.以usernameuser登录,在A机器上运行 ssh-keygen -t rsa 一路回车.不须要输入password ...
- I2C上拉电阻取值范围
I2C总线是微电子通信控制领域中常用的一种总线标准,具备接线少,控制简单,速率高等优点.在I2C电路中常见的上拉电阻有1k.1.5k.2.2k.4.7k.5.1k.10k等等,但是应该如何根据开发要求 ...
- win7-64bit安装comtypes的问题
Update 28/12/2014: Please download the latest comtypes 1.1.1 from https://pypi.python.org/pypi/comty ...
- Eclipse项目遇到问题汇总
1:gc overhead limit exceeded 原因:这是由于项目中eclipse内存分配不足导致 修改:修改eclipse.ini文件 修改如下: ...