1. 程式人生 > >UVA-11761-馬爾可夫/記憶化搜索

UVA-11761-馬爾可夫/記憶化搜索

cstring return pro cin push_back 保存 include ini sum

https://vjudge.net/problem/UVA-11762

    給出一個整數n,每次隨機挑選一個小於等於n的素數,如果是n的因子,n變為n/x ,否則不變,問n變為1的期望挑選次數。

  f[i]=1/(m1+m2)*(SUM{ f[i] } + SUM{ f[i/x] }) +1,化簡後記憶化搜索就好了,篩素數的時候要保存所有的素數所以不能根號優化。

  

 1 #include<iostream>
 2 #include<cstring>
 3 #include<queue>
 4 #include<cstdio>
 5 #include<stack>
 6
#include<set> 7 #include<map> 8 #include<cmath> 9 #include<ctime> 10 #include<time.h> 11 #include<algorithm> 12 using namespace std; 13 #define mp make_pair 14 #define pb push_back 15 #define debug puts("debug") 16 #define LL long long 17 #define pii pair<int,int> 18
#define eps 1e-10 19 bool is[1001000]; 20 int prime[100000],tot; 21 double f[1001000]; 22 void init(){ 23 is[0]=is[1]=1; 24 for(LL i=2;i<=1000000;++i){ 25 if(!is[i]){ 26 prime[tot++]=i; 27 for(LL j=i*i;j<=(LL)1000000;j+=i) 28 is[j]=1; 29 } 30 } 31 } 32 double
dfs(int u){ 33 if(f[u]) return f[u]; 34 if(u==1) return f[u]=0; 35 int g=0,p=0; 36 f[u]=0; 37 for(int i=0;i<tot&&prime[i]<=u;++i){ 38 p++; 39 if(u%prime[i]==0){ 40 f[u]+=dfs(u/prime[i]); 41 g++; 42 } 43 } 44 f[u]=(f[u]+p)/g; 45 return f[u]; 46 } 47 int main() 48 { 49 int n,m,i,j,k,t; 50 int cas=0; 51 init(); 52 cin>>t; 53 while(t--){ 54 memset(f,0,sizeof(f)); 55 scanf("%d",&n); 56 printf("Case %d: %.11f\n",++cas,dfs(n)); 57 } 58 return 0; 59 }

UVA-11761-馬爾可夫/記憶化搜索