51nod1317 相似字符串对 组合数学

称一对字符串(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。

例如:N=2,k=2,一共有6种不同的相似字符串对,它们是:  ("aa", "aa"), ("ab", "ab"),

("ab", "ba"), ("ba", "ab"), ("ba", "ba"), ("bb", "bb").

Input

一行2个整数N,k,其中1<=N<=1,000,000,000,1<=k<=26

Output

一个整数,即不同相似字符串对的数量 mod  1,000,000,007后的结果。

Input示例

2 2

Output示例

6

求满足条件的字符串的数量思路:找得到字符串C的条件是什么?怎么去计数?怎么防止重复计算?在写一些小字符串手算方案数之后,发现其实问的就是:长度为n的字符串,一共有k^n个,对每个字符串拿一个后缀放到前面组成新串,再和原串组成的pair的个数比如一个串xy可以组成(xy,xy),(xy,yx)不考虑重复的话,答案就是k^n * n(空串也算一个后缀)考虑重复后发现,对于一个串str,可以写成循环的模式(s)k,表示由k个s连接可以形成str,并且使得k最大,也就是|s|最小,那str可以组成的pair有|s|个,对答案贡献|s|并且每一个str都可以写成循环的模式,因为str = (str)1令f(i)表示|s|为i的字符串的方案数则ans = ∑i|nf(i) * i令g(i)表示|s|为i的约数的字符串的方案数则:g(i) = ki = ∑d|if(d)反演以下就得到f的公式了,代入ans这个式子,再推一推,得到:ans = ∑k|n k * Akj|n/k mu(j) * j这里的A是输入的数据"k"对于后面的求和,只需要考虑mu(j)不为0的情况,一个固定的n/k,可以根号求素因子,再dfs枚举每个素因子要不要,求和复杂度小于O(sqrt(n/k) + 2^10)然后n最多大约有800个因子k所以这里直接枚举k,对于每一个k"一次根号+一次dfs"求后面的求和式子是没问题的




时间: 2024-11-05 08:42:35

51nod1317 相似字符串对 组合数学的相关文章

51Nod1317 相似字符串对 容斥原理 动态规划

原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1317.html 题目传送门 - 51Nod1317 题意 称一对字符串(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

[BZOJ1856][SCOI2010]字符串(组合数学)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1856 分析:http://www.cnblogs.com/jianglangcaijin/p/3443689.html 简直了…… 因为20100403是质数 所以最后那个组合数直接用欧拉定理求乘法逆元就可以了……

随意记录

本文的主要内容,都是自己平时在网上看到的一些资料,觉的蛮有用处的,就摘录在纸上,只是零星的知识感悟,再次收集整理. 1. 在讲解一个有关程序的问题时,先从整体的调用流程出发,再开始介绍重要的结构体,要看并且有自己的总结,大体介绍一些相关的流程,最后,要自己来解释,为什么要这样来做.在标注代码时,代码中特别需要注意的需要加上备注.讲解过程,讲解细节.在最后结尾的时候,给出参考网址.参考文献和具体的代码路径. 2. 在中小型实体或者贸易企业,有毛利和净利之说. 销售净利润率 = 净利润/销售收入 销

背包九讲(转载)

转载 背包问题 //0 1背包 #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int i,j,n,v,f[1100],w[1100],p[1100]; scanf("%d",&t); while(t--) { memset(f,0,sizeof(f)); scanf("%d%d",&

ligh1060(求字符串第k大排列)组合数学

题意:求给定字符串(有重复字符)第k大排列. 解法:先判断字符串的所有排列是否够k个.然后从左向右每一位每一位确定.简单的组合数学. 代码: /**************************************************** * author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,10240000

【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)

ACM字符串 1.长度不能超过n 2.字符串中仅包含大写字母 3.生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 输入一个正整数T,代表有T组数据 接下来T行,每行一个正整数n,n<=10. 输出 输出符合条件的字符串的数目 样例输入 1 3 样例输出 1 做题过程: 熬了三四个小时,WA了无数次!最终推出了组合数的公式! 首先暴力打表,嘿嘿!这样极大地压缩计算时间! 打表如下: 一:生成连续的7位绝对

NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))

Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m.但是大家来的时间不同,随机次序来机房,带电脑的人直接准备比赛而没带电脑的人需要向带电脑并还没和别人公用的人求助(当然会答应).但是,如果不存在带电脑并还没和别人公用的人,那他就要等了,等是很让人头疼的,这就不和谐了,当然假如没有这样的情况发生比赛是很和谐的. Input 输入多组数据,每组数据只有一行m(

HDU 4909 String(组合数学)

HDU 4909 String 题目链接 题意:给定一个字符串全是小写字符,可能有一个位置为?,问号可以替代任何字符,也可以删掉,问有多少连续字串满足所有字母是偶数个 思路:组合数学,计算所有前最串的各个字母的奇偶状态,用一个01串表示,然后记录下个数,对于每个相同的状态,任选两个就能得到一个子序列,答案为所有C(num, 2)的和. 但是这个问题多了一个?的情况,但是没关系,可以枚举?,然后把序列分为3部分去考虑,?之前,?之后,和包含了?的串分开考虑即可 代码: #include <cstd

[ACM] POJ 1026 Cipher (组合数学,置换)

Cipher Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19228   Accepted: 5148 Description Bob and Alice started to use a brand-new encoding scheme. Surprisingly it is not a Public Key Cryptosystem, but their encoding and decoding is base