UVa 11762 - Race to 1

系统 1835 0

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2862

晕 多加了一个# wa了N久  细节呀

代码及其注释:

      #include<iostream>

#include<cstdio>

#include<string>

#include<cstring>

#include<cmath>

#include<set>

#include<map>

#include<stack>

#include<vector>

#include<algorithm>

#include<queue>



#define ull unsigned long long

#define ll long long

#define lint long long

using namespace std;



const double eps=1e-12;

const int INF=0x3f3f3f3f;

const int N=1000010;

double dp[N];//记忆化搜索数组

int p[N];//标记是否是素数

int prime[N];//将素数从小到大放到prime数组里面

double dfs(int x)

{

    if(dp[x]>=-0.5)

    return dp[x];//记忆化

    if(x==1)//边界

    return (dp[x]=0.0);

    double sum=0.0;

    int p=0,g=0;//p表示所有小于等于x的素数个数 g表示这些素数中是x的约数的个数

    for(p=0;prime[p]<=x;++p)//枚举所以小于等于x的素数

    if(x%prime[p]==0)

    {

        ++g;

        sum+=dfs(x/prime[p]);

    }

    return (dp[x]=(sum+p)/g);//这个式子推导可得

}

int main()

{

    //freopen("data.in","r",stdin);

    memset(p,-1,sizeof(p));

    int ln=0;

    for(int i=2;i<N;++i)

    {

        if(p[i])

        {

            prime[ln++]=i;

            for(int j=i+i;j<N;j+=i)

            {

                p[j]=0;

            }

        }

    }

    for(int i=0;i<N;++i) dp[i]=-1.0;

    int T;

    scanf("%d",&T);

    for(int c=1;c<=T;++c)

    {

        int n;

        scanf("%d",&n);

        printf("Case %d: %.10lf\n",c,dfs(n));

    }

    return 0;

}


    

 

UVa 11762 - Race to 1


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论