D - Maximum Value Problem FZU - 2037
题意;
这个序列[1,3,2,4],maxx=0.如果将maxx赋值为最大值需要3次,第一次为maxx=1,第二次maxx=3,第三次maxx=4
给你一个n,求n全排列的查找次数之和,以及次数/全排列数量
题解:
推公式,,,我也不知道怎么推的
貌似打表可以得到:
f[n]表示n的全排列的查找次数之和
f(n) = f(n - 1) * n + (n - 1)!
p[n]=f[n]/n! = p[n-1]+1/n
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b)
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e6+9;
const int mod=1e9+7;
int f[maxn];
double p[maxn];
void init(){f[1]=1;f[2]=3;p[2]=1.5;ll cal=2;for(int i=3;i<=1e6+2;i++){f[i]=(f[i-1]*i+cal)%mod;p[i]=p[i-1]+1.0/i; cal*=i;}
}
int main()
{int t;init(); cin>>t;int cas=0;while(t--){int n;cin>>n;printf("Case %d: %lld %.6lf\n", ++cas, f[n], p[n]);}
}