給出乙個長度為n, 由小寫英文本母組成的字串s, 求在所有由小寫英文本母組成且長度為n 且恰好有k 位與s 不同的字串中,給定字串t 按照字典序排在第幾位。
由於答案可能很大,模10^9 + 7 輸出。
列舉乙個
i ,表示當前做到第
i位,而前i−
1 位的字元都已經與目標串的前i−
1 位相同,那麼對於當前位置可以分三種情況討論。
t 為目標串,
s為判定串。
1. 當ti
>si
時,意味著目標串當前位可能包含判定串,所以分成兩條式子,分別計算當前位置相等與不相等的情況。
2. 當ti
=si 時,意味著目標串當前位最多等於判定串,而因為當等於時,後續操作能夠處理到,所以只用計算不相等是的貢獻。
3. 當ti
時,與上述情況相似,只是略有一點不同。
很簡單也很好想,但是我調了一下午。
const mo=1000000007;
var c,mi,ni,s,t:array[0..100000] of int64;
n,m,i:longint;
ans:int64;
st:ansistring;
function
max(x,y:longint):longint;
begin
if x>y then
exit(x) else
exit(y);
end;
function
ksm(x,y:longint):int64;
begin
if y=0
then
exit(1);
if y=1
then
exit(x mod mo);
if y mod
2=0then
exit(sqr(ksm(x,y div
2))mod mo)
else
exit(x*ksm(x,y-1)mod mo);
end;
begin
readln(n,m);
c[0]:=1;mi[0]:=1;
for i:=1
to n do c[i]:=(c[i-1]*i)mod mo;
for i:=1
to n do mi[i]:=(mi[i-1]*25)mod mo;
ni[n]:=ksm(c[n],mo-2);
for i:=n-1
downto
0do ni[i]:=ni[i+1]*(i+1) mod mo;
readln(st);
for i:=1
to n do t[i]:=ord(st[i])-96;
readln(st);
for i:=1
to n do s[i]:=ord(st[i])-96;
for i:=1
to n do
begin
if m=0
then
break;
if s[i]=t[i] then
begin
ans:=(ans+max(0,s[i]-1)*mi[m-1] mod mo*c[n-i] mod mo*ni[m-1] mod mo*ni[n-i-m+1] mod mo)mod mo;
end;
if s[i]>t[i] then
begin
ans:=(ans+max(0,s[i]-2)*mi[m-1] mod mo*c[n-i] mod mo*ni[m-1] mod mo*ni[n-i-m+1] mod mo)mod mo;
if n-i-m<0
then
begin
dec(m);
continue;
end;
ans:=(ans+mi[m]*c[n-i] mod mo*ni[m] mod mo*ni[n-i-m] mod mo)mod mo;
dec(m);
end;
if s[i]then
begin
if n-i-m+1
<0
then
begin
dec(m);
continue;
end;
ans:=(ans+max(0,s[i]-1)*mi[m-1] mod mo*c[n-i] mod mo*ni[m-1] mod mo*ni[n-i-m+1] mod mo)mod mo;
dec(m);
end;
end;
writeln(ans+1);
end.
NOIP2016提高A組五校聯考1 道路規劃
我們考慮,當現在有乙個合法的集合時,如何往裡面增加乙個點,使這個集合仍然合法。假設現在有乙個合法的集合,那麼當我們加入乙個點,它的道路穿過來整個集合,那麼 然後搞一遍最長下降子串行就可以了。include include include include include const int maxlo...
NOIP2016提高A組五校聯考1 挖金礦
剛看到這題時,還在想怎麼貪心,然後很快的打完之後發現貪心是錯的。然後仔細的看了看範圍,哈哈,這不是二分嗎。二分出乙個mid,然後在所有行裡面用mid j 字首和然後找乙個最大值。最後把這些最大值加起來,判斷一下就好了。include include include include include i...
NOIP2016提高A組五校聯考1 挖金礦
答案,保留4位小數 4 3 4 3 3 5 1 6 2 6 1 3 2 9 4.4286 n m 100000 很簡單的一道題 設sum i j 表示第i列向下挖j行的字首和 假設第i列挖h i 行 設二分的答案是m,答案如果合法,那麼 n i 1s um i h i ni 1 h i m 移項 i...