为什么这样是对的
#include<bits/stdc++.h>
using namespace std;
template<typename T>
void read(T& x){x=0;char ch=getchar();long long f=1;while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}x*=f;}
template<typename T,typename... Args>
void read(T& first,Args&... args){read(first);read(args...);}
template<typename T>
void write(T arg){T x=arg;if (x<0){putchar('-');x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');}
template<typename T,typename... Args>
void write(T& arg,Args&... args){write(arg);if(sizeof...(args) !=0){putchar(' ');write(args...);}}
#define hc putchar('\n')
#define kg putchar(' ')
typedef long long ll;
const int N=1e4+5;
double g[N];
double f[N];
ll s[N];
int n;
int main(){
read(n);
g[n]=0;
f[n]=0;
for(int i=n-1;i>=0;i--){
double j=n-i;
f[i]=f[i+1]+1.0*n/j;
g[i]=f[i+1]+g[i+1]+1.0*i/j*f[i]+1.0*n/j;
}
printf("%.2lf",g[0]);
return 0;
}
这样是错的
#include<bits/stdc++.h>
using namespace std;
template<typename T>
void read(T& x){x=0;char ch=getchar();long long f=1;while(!isdigit(ch)){if(ch=='-')f*=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}x*=f;}
template<typename T,typename... Args>
void read(T& first,Args&... args){read(first);read(args...);}
template<typename T>
void write(T arg){T x=arg;if (x<0){putchar('-');x=-x;}if(x>9){write(x/10);}putchar(x%10+'0');}
template<typename T,typename... Args>
void write(T& arg,Args&... args){write(arg);if(sizeof...(args) !=0){putchar(' ');write(args...);}}
#define hc putchar('\n')
#define kg putchar(' ')
typedef long long ll;
const int N=1e4+5;
double g[N];
double f[N];
ll s[N];
int n;
int main(){
read(n);
g[n]=0;
f[n]=0;
for(int i=n-1;i>=0;i--){
int j=n-i;
f[i]=f[i+1]+1.0*n/j;
g[i]=f[i+1]+g[i+1]+1.0*i/j*f[i]+1.0*n/j;
}
printf("%.2lf",g[0]);
return 0;
}