1. 程式人生 > >LIghtOJ1038---Race to 1 Again【期望dp】

LIghtOJ1038---Race to 1 Again【期望dp】

題意:一個整數n每次除以他的因子求除以到1時的期望次數。

t=10000,100000>=n>=1肯定要打表的。

dp【50】=(dp【1】+dp【2】+dp【5】+dp【10】+dp【25】+dp【50】)/6+1。1是貢獻的次數1。

按這個方程打表即可。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
double dp[100006];int w[10000];
int main()
{
	dp[1]=0;
	for(int i=2;i<=100000;i++)
	{
		double w=0,e=0;
		for(int j=1;j*j<=i;j++)
		{
			if(i%j!=0)
			continue;
			else
			{
				if(j*j!=i)
				{
					e+=2;w+=dp[j]+dp[i/j];	
				}	
				else
				{
					e++;w+=dp[j];
				}
			}
		}
		dp[i]=(w+e)/(e-1);
	}
	int t;
	cin>>t;int o=0;
	while(t--)
	{
		int n;
		cin>>n;
		printf("Case %d: ",++o);
		printf("%lf\n",dp[n]);
	}
	return 0;
 }