考研路茫茫——单词情结
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2789 Accepted Submission(s): 782
Problem Description
背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。
一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。
于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义。
比如一共有2个词根 aa 和 ab ,则可能存在104个长度不超过3的单词,分别为
(2个) aa,ab,
(26个)aaa,aab,aac...aaz,
(26个)aba,abb,abc...abz,
(25个)baa,caa,daa...zaa,
(25个)bab,cab,dab...zab。
这个只是很小的情况。而对于其他复杂点的情况,Lele实在是数不出来了,现在就请你帮帮他。
Input
本题目包含多组数据,请处理到文件结束。
每组数据占两行。
第一行有两个正整数N和L。(0 第二行有N个词根,每个词根仅由小写字母组成,长度不超过5。两个词根中间用一个空格分隔开。
Output
对于每组数据,请在一行里输出一共可能的单词数目。
由于结果可能非常巨大,你只需要输出单词总数模2^64的值。
Sample Input
Sample Output
Author
linle
Recommend
lcy
这道题从上午搞到现在终于是用两种方法搞完了
在这里想说一句,输入的n,l其中l要用到64位,因为后面算26^1+26^2+...+26^l或者A^1+A^2+A^3+...+A^l时要用到(l+1)/2进行二分快速幂,而l+1可能会超int,网上很多都没说清楚
第二个就是求26^1+26^2+...+26^l或者A^1+A^2+A^3+...+A^l都可以用二分进行快速幂或直接进行矩阵快速幂,在这里我两种方法都写了
第三个就是计算26^1+26^2+...+26^l不要用等比公式变成(26^(l+1)-26)/25去进行快速幂计算,这样会出错,至于为什么出错自己调试调试就知道了
第四个就是题目中说结果可能很大需要去mod 2^64,在这里直接定义变量unsigned __int64,这样超出的就自动截断了,相当于mod
分析+题解请看代码
第一种方法:用二分矩阵快速幂求A^1+A^2+...+A^l
/*
分析:相信做过poj2778的都知道如何求长度为n的模式串不包含病毒串的个数
没做过的建议去做,此题是poj2778的加强版
本题只需要求出长度<=n的所有串-包含病毒串的个数
即26^1+26^2+26^3+...+26^n-(A^1+A^2+A^3+...+A^n);//A是状态矩阵,即在满足条件下到达另一个状态的个数
26^1+...+26^n可以用快速幂求出h或者矩阵快速幂求出,A^1+...+A^n可以用矩阵二分快速幂求出或者构造:
|1 26| |Sn | |Sn+1 |
|0 26|*|26^n|=|26^(n+1)|;//Sn=26^1+26^2+...+26^n
|A 1| |Sn| |Sn+1|
|0 1|*| A|=|A |;//Sn=A+A^2+A^3+...+A^n
只要:|A 1|
|0 1|
自乘n次与|S0|相乘即可,则可以用矩阵快速幂求
|A |
*/
#include
#include
#include
#include
#include
#include
#include
#include
第二种方法:用包含矩阵的矩阵进行快速幂求A^1+A^2+A^3+...+A^l;//第一次这种方式写,不知道是不是我写错了,感觉效率增加不是很多,为什么别人说效率会增加4倍左右呢,有知道的大神请指教
/*
分析:相信做过poj2778的都知道如何求长度为n的模式串不包含病毒串的个数
没做过的建议去做,此题是poj2778的加强版
本题只需要求出长度<=n的所有串-包含病毒串的个数
即26^1+26^2+26^3+...+26^n-(A^1+A^2+A^3+...+A^n);//A是状态矩阵,即在满足条件下到达另一个状态的个数
26^1+...+26^n可以用快速幂求出h或者矩阵快速幂求出,A^1+...+A^n可以用矩阵二分快速幂求出或者构造:
|1 26| |Sn | |Sn+1 |
|0 26|*|26^n|=|26^(n+1)|;//Sn=26^1+26^2+...+26^n
|A 1| |Sn| |Sn+1|
|0 1|*| A|=|A |;//Sn=A+A^2+A^3+...+A^n
只要:|A 1|
|0 1|
自乘n次与|S0|相乘即可,则可以用矩阵快速幂求
|A |
*/
#include
#include
#include
#include
#include
#include
#include
#include