WOJ1088-从1开始的N个连续自然数的M次方之和

该博客主要探讨如何编程计算从1开始到N的连续自然数的M次方之和,并要求对结果进行科学记数法表示,保留3位有效数字。输入包含N和M两个整数,其中1<=N<=10000000,1<=M<=20。" 92179189,8256779,Oracle数据库存储极限与ROWID解析,"['数据库', '大数据', 'Oracle数据库']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题,请编程求出1^M+2^M+3^M+...+N^M的近似值

输入格式

包含多组数据,每组数据包含两个整数:N和M。(1<=N<=10000000,1<=M<=20)

输出格式

对输入的每组数据,用科学记数法输出结果(保留3位有效数字)。

样例输入

4 3

样例输出

1.00E2


#include<stdio.h>
#include<math.h>
#define CM 22
int Com21[CM][CM];
double Com(int n, int k) {
	if (n < CM) {
		return Com21[n][k];
	}
	double ans = 1;
	int i;
	for (i = 1; i <= k; ++i)
		ans *= (double)(n - k + i) / (double)i;
	return ans;
}
double power(int k, int a) {
	double ans = 1.0, tmp = k;
	while (a) {
		if (a & 1) {
			ans *= tmp;
		}
		tmp *= tmp;
		a >>= 1;
	}
	return ans;
}
double solve(int nn, int mm) {
	double n = nn;
	switch (mm) {
		case 1:
			return (n + 1) * n / 2;
		case 2:
			return solve(n, 1) * (2 * n + 1) / 3;
		case 3:
			return solve(n, 1) * solve(n, 1);
		case 4:
			return solve(n, 1) * (6 * n * n * n + 9 * n * n + n - 1) / 15;
		case 5:
			return solve(n, 1) * n * (2 * n * n * n + 4 * n * n + n - 1) / 6;
		default: {
			double tmp, ans = 0.0;
			int k, i;
			for (k = 1; k <= mm; ++k) {
				tmp = 0.0;
				for (i = 0; i <= k - 1; ++i) {
					if (i % 2 == 0) {
						tmp += Com(k, i) * power(k - i, mm);
					} else {
						tmp -= Com(k, i) * power(k - i, mm);
					}
				}
				ans += tmp * Com(nn + 1, k + 1);
			}
			return ans;
		}
	}
}
/*void display(double d) {
    int b = log10(d);
    double a = d / power(10, b);
    printf("%.2fE%d\n", a, b);
}
*/
int main () {
	int i, j;
	for (i = 1; i < CM; ++i) {
		Com21[i][0] = Com21[i][i] = 1;
		for (j = 1; j < i; ++j) {
			Com21[i][j] = Com21[i - 1][j - 1] + Com21[i - 1][j];
		}
	}
	int N,M;
	while(scanf("%d%d",&N,&M)!=EOF) {
		//display(solve(N, M));
		double ans=solve(N,M);
		int b=log10(ans);
		double a=ans/power(10,b);
		printf("%.2fE%d\n",a,b);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值