51nod 1317 相似字串對 容斥原理 數學

2021-08-10 09:37:55 字數 1295 閱讀 4215

稱一對字串(a,b)是相似的,當且僅當滿足以下條件:

(1)字串a和b都恰好包含n個字元;

(2)a和b串中的每個字元都是小寫字母的前k個字元,即a、b中只可能出現』a』,』b』,』c』,…,(』a』+k-1)這k個字元;

(3)存在乙個字串c,滿足:a+c=c+b。這裡的「+」號表示字串間的鏈結,即str1+str2 = str1str2,如:「aaa」+「csd」=「aaacsd」。

例如,n=3,k=4那麼(」aad」,」daa」)就是相似字串對。

因為c=」aa」時,有」aad」+」aa」=」aadaa」=」aa」+」daa」.

現在給出n與k,問有多少種不同的相似字串對,輸出這個結果 mod 1,000,000,007的值。

說明:兩個字串對(a,b)與(c,d)是不同的,只要 a!=c 或 b!= d。

1<=n<=1,000,000,000,1<=k<=26

分析一下兩個字串相似的條件不難得出實際上就是問有多少個字串對(a,b)使得a和b迴圈同構。

顯然對於乙個迴圈節為t的串a,共有t個不同的串b使得a和b迴圈同構。

考慮列舉迴圈節。因為迴圈節必然是n的因數,所以先把n的所有因數求出來。不難發現n的因數個數最多只有1000個左右。

設f[i]表示迴圈節恰好為i的字串有多少個。f[

i]=k

i−∑j

|if(

j)因為i的因數也一定是n的因數,所以只要列舉所有小於i的n的因數即可。

答案就是∑i

|ni∗

f(i)

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int n=2005;

const

int mod=1000000007;

int n,m,tot,a[n],f[n];

int ksm(int x,int y)

return ans;

}int main()

sort(a+1,a+tot+1);

ll ans=0;

for (int i=1;i<=tot;i++)

ans+=ans<0?mod:0;

printf("%lld",ans);

return

0;}

1317 相似字串對

51nod 相似字串 根據題意要求所有滿足題意的相似字串對數,相似字串對滿足a c c b,進一步分析能得到a,b字串必須滿足a d e,b e d。這時候只要構造滿足要求的a,b。可以看出,a有k n種情形,b只要根據a進行對應的變化就行 將a前後兩部分對調位置 不過可能出現重複情形。這時候只要想...

51Nod1753 相似子串

兩個字串相似定義為 1.兩個字串長度相等 2.兩個字串對應位置上有且僅有至多乙個位置所對應的字元不相同 給定乙個字串,每次詢問兩個子串在給定的規則下是否相似。給定的規則指每次給出一些等價關係,如 a b b c 等,注意這裡的等價關係具有傳遞性,即若 a b b c 則 a c input 第一行乙...

51nod 1753 相似子串

兩個字串相似定義為 1.兩個字串長度相等 2.兩個字串對應位置上有且僅有至多乙個位置所對應的字元不相同 給定乙個字串,每次詢問兩個子串在給定的規則下是否相似。給定的規則指每次給出一些等價關係,如 a b b c 等,注意這裡的等價關係具有傳遞性,即若 a b b c 則 a c 第一行乙個字串s 1...