20140711 loop-II 调和数列
首先对于点x与点y 若他们之间有一条又向边
则可将他们两个当作一个点处理
只有一个点时 期望环的个数为1
对于有n个点时
点x有 1/n 的概率形成1个环 期望值为 1/n
若点x与其他顶点y相连 相连过后即只剩 n-1 个顶点
对于剩下的 n-1 个点
又有 1/(n-1) 的概率形成1个环 期望值为 1/(n-1)
所以总的期望值为 1+1/2+1/3......1/n
对于n<=5000000的数据直接 O(n) 求值
对于大数据 ans=ln(n)+euler (euler为欧拉常数)
1 #include <cstdio> 2 #include <cmath> 3 using namespace std; 4 #define EPS 11e-10 5 #define euler 0.57721566490 6 typedef long long LL; 7 8 LL n,m; 9 10 int main() { 11 scanf("%lld%lld",&n,&m); 12 if (n<=5000000) { 13 double ans=0.0; 14 for (LL i=1;i<=n;i++) ans+=1.0/double(i); 15 ans=ans*double(m); 16 printf("%d",(int)floor(ans-EPS)); 17 } 18 else printf("%d",(int)floor((log(n)+euler)*m-EPS)); 19 }