按照回文子串的奇偶分类讨论,分别计算其对答案的贡献,然后奇偶分别进行求和。
推导出来,化简一下……发现奇数也好,偶数也好,都可以拆成一个等比数列求和,以及一个可以错位相减的数列求和。
然后用高中数学知识搞一下就行了。
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; int N; double K; double Quick_Pow(double x,int p){ if(!p){ return 1; } double ans=Quick_Pow(x,p>>1); ans=ans*ans; if(p&1){ ans=ans*x; } return ans; } int main(){ // freopen("c.in","r ",stdin); while(scanf("%d%lf",&N,&K)!=EOF){ if(K==1){ cout<<(ll)(N+1)*(ll)N/2ll<<endl; } else{ double a=(double)(2+N)*(1-Quick_Pow(1/K,(N+1)/2))/(1-(1/K)); double b=-2.0*(1-Quick_Pow(1/K,(N+1)/2))/(1-1/K)/(1-1/K); double c=2.0*(double)((N+1)/2)/Quick_Pow(K,(N+1)/2)/(1-1/K); // double d=((double)(N+1)-2.0*(1-Quick_Pow(1/K,N/2+1))/(1-1/K))/(K+1); // double d=((double)(N+1)/K-2.0*(1-Quick_Pow(1/K,N/2))/(K-1)-((double)(N+2)-2*(N/2))/Quick_Pow(K,N/2+1))/(1-1/K); double d=(double)(N+1)*(1-Quick_Pow(1/K,N/2))/K/(1-1/K); double e=-2.0*(1-Quick_Pow(1/K,N/2))/K/(1-1/K)/(1-1/K); double f=2.0*(double)(N/2)/Quick_Pow(K,N/2+1)/(1-1/K); printf("%.10f\n",a+b+c+d+e+f); } } return 0; }
时间: 2024-10-13 01:43:37