标签:方法 center std 组合 while bsp 范围 style fill
其中 x为当前单词的左右距离为k的单词的个数, 分子是把一排单词中一个单词的有效距离的单词取出来全排列到环形的无效距离内,然后剩余的单词全排列;
考虑到排列与组合数据过大,用 exp()函数,其中log(N!)=log(N)+log(N-1)+...+log(1);
需要注意 用long double能过。。。
代码如下:
没大弄明白为什么n-1-x < 2*k 的时候不考虑
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define N 100005 long double temp[N]; int n,k; double solve() { if(n==1) return 0;//只有一个单词,无效为0 else if(2*k+1>=n) return n;//如果圈中的一个单词从左边或右边距离都小于K,则该单词无效,所有单词等效 double ret=0; for(int i=1;i<=n;i++) { int x=min(k,i-1)+min(k,n-i);//一个单词左右k范围内的单词个数 if(n-1-x-2*k>=0) { ret+=exp(temp[n-1-x]+temp[n-1-2*k]-temp[n-1]-temp[n-1-x-2*k]); } // else // ret += exp(temp[2*k] - temp[2*k-n+1+x] + temp[x] - temp[n-1]); } return n-ret; } int main() { temp[0]=0; for(int i=1;i<N;i++) temp[i]=temp[i-1]+log((long double)i); int cas=1; while(scanf("%d%d",&n,&k)) { if(n==0&&k==0) break; printf("Case %d: %.4lf\n",cas++,solve()); } return 0; }
🔺 Garbage Remembering Exam UVA - 11637()
标签:方法 center std 组合 while bsp 范围 style fill
原文地址:https://www.cnblogs.com/WTSRUVF/p/9354057.html