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 }
View Code

 

posted @ 2014-07-11 19:39  __fjm  阅读(194)  评论(0编辑  收藏  举报