• 【Uva11762】Race to 1


    模拟马尔可夫过程,具体看书。

    #include<bits/stdc++.h>
    #define N 1000010
    using namespace std;
    int prime[N],use[N],cnt=0;
    void calcprime(){
        cnt=0;memset(use,1,sizeof(use));
        for(int i=2;i<=N;i++){
            if(use[i]){prime[++cnt]=i;}
            for(int j=1;j<=cnt;j++){
                int t=prime[j]*i;if(t>N)break;
                use[t]=0;
                if(i%prime[j]==0)break;
            }
        }
    }
    bool vis[N];double f[N];
    double dfs(int x){
        if(x==1)return 0.0;if(vis[x])return f[x];
        vis[x]=1;double &ans=f[x];
        int g=0,p=0;ans=0;
        for(int j=1;j<=cnt;j++){
            if(prime[j]>x)break;++p;
            if(x%prime[j]==0){g++;ans+=(dfs(x/prime[j]));}
        }
        ans=(ans+p)/g;return ans;
    }
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        calcprime();int T=read();
        for(int t=1;t<=T;t++){
            printf("Case %d: %.10lf
    ",t,dfs(read()));
        }
        return 0;
    }#include<bits/stdc++.h>
    #define N 1000010
    using namespace std;
    int prime[N],use[N],cnt=0;
    void calcprime(){
        cnt=0;memset(use,1,sizeof(use));
        for(int i=2;i<=N;i++){
            if(use[i]){prime[++cnt]=i;}
            for(int j=1;j<=cnt;j++){
                int t=prime[j]*i;if(t>N)break;
                use[t]=0;
                if(i%prime[j]==0)break;
            }
        }
    }
    bool vis[N];double f[N];
    double dfs(int x){
        if(x==1)return 0.0;if(vis[x])return f[x];
        vis[x]=1;double &ans=f[x];
        int g=0,p=0;ans=0;
        for(int j=1;j<=cnt;j++){
            if(prime[j]>x)break;++p;
            if(x%prime[j]==0){g++;ans+=(dfs(x/prime[j]));}
        }
        ans=(ans+p)/g;return ans;
    }
    inline int read(){
        int f=1,x=0;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
        do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
        return f*x;
    }
    int main(){
        calcprime();int T=read();
        for(int t=1;t<=T;t++){
            printf("Case %d: %.10lf
    ",t,dfs(read()));
        }
        return 0;
    }
  • 相关阅读:
    转:C#操作摄像头
    C# Memcached缓存
    WCF:调用方未由服务器进行身份验证
    SQL Server 存储过程进行分页查询
    SQL Server T-SQL高级查询
    C#设计模式总结(转)
    C#中构造函数和析构函数区别
    C#: static关键字的作用(转)
    C#结构体和类的区别(转)
    .NET多线程编程(转)
  • 原文地址:https://www.cnblogs.com/zcysky/p/6904279.html
Copyright © 2020-2023  润新知