题意:
给出一个每个数位都不同的数n,进行一场游戏。每次游戏将n个数的每个数位重组。如果重组后的数比原来的数大则继续游戏,否则算输。如果重组后的数是最大的数则算赢,问赢的概率。
题解:
用康拓展开求出n是第几大的数,然后递推后面的概率。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int t; char s[15]; double ans; int fac[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880}; double cal(char *s) { int res = 0; int k = strlen(s); for(int i = 0; i < k; i++) { int cnt = 0; for(int j = i+1; j < k; j++) if(s[j]<s[i]) cnt++; res += fac[k-i-1]*cnt; } if(res==fac[k]-1) return 0; double ans = 1.0/fac[k]; for(int i = res; i < fac[k]-2; i++) ans += ans/fac[k]; return ans; } int main() { scanf("%d", &t); while(t--) { scanf("%s", s); printf("%.9lf\n", cal(s)); } }