题目连接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1619
题目大意:
给定字符集大小,每次随机产生一个字符,直到出现给定的字符串时停止。问期望长度
解题思路:
不知很清楚为什么这么做,看了别人代码。具体数学上有证明,在第二版的401的8.4FLIPPING COINS上有证明,但是本人水平太渣了,没看懂。。。囧。最开始是用kmp+高斯消元搞的,精度怎么改都不够,这个原理也看不懂,我真是太弱了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char str[20];
bool judge(int i,int j){
for(int k=0;str[i+k]&&str[j+k];k++){
if(str[i+k]!=str[j+k])return false;
}
return true;
}
int main(){
int T;
scanf("%d",&T);
int ca=1;
while(T--){
int n;
scanf("%d%s",&n,str);
long long res=0;
for(int i=0;str[i];i++){
if(judge(0,i))res++;
res=res*n;
}
printf("Case %d:\n",ca++);
printf("%lld\n",res);
if(T)printf("\n");
}
}