社区讨论

90pts WA on #5 求调

P1298最接近的分数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m2ylrljm
此快照首次捕获于
2024/11/01 18:39
去年
此快照最后确认于
2025/11/04 15:35
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

double r = 0.00000000000, d = DBL_MAX;
int m, n, p, q;
bool b = 0;

void yf(int x, int y) 
{
	int t = 2;
	while (t <= min(x, y) / 2 && !(x%t) && !(y%t)) {
		x /= t, y /= t;
		if (x%t || y%t) ++t;
	}
	if (x == y) p = q = 1;
	else p = x, q = y;
}

int yfp(int x, int y) 
{
	int t = 2;
	while (t <= min(x, y) / 2 && !(x%t) && !(y%t)) {
		x /= t, y /= t;
		if (x%t || y%t) ++t;
	}
	if (x == y) return 1;
	else return x;
}

int main() 
{
	freopen("P1298.txt", "r", stdin);
	scanf("%d%d", &m, &n); scanf("%lf", &r);
	for (int k = 1; k <= n; ++k) {
		bool t = 1;
		if (abs(-(double)(int)(k*r)/(double)k + r) < d && yfp((int)(k*r),k) <= m) {
			d = abs(-((double)(int)(k*r)/(double)k - r));
			yf((int)(k*r), k);
//			p = (int)(k*r), q = k;
			b = 0, t = 0;
//			printf("%d %d\n", p, q);
		}
		if (abs((double)(int)(k*r+1)/(double)k - r) < d && yfp((int)(k*r+1),k) <= m) {
			d = abs((double)(int)(k*r+1)/(double)k - r);
			yf((int)(k*r+1), k);
//			p = (int)(k*r+1), q = k;
			b = 0, t = 0;
//  		printf("%d %d\n", p, q);
		}
		if (t && ((-(double)(int)(k*r)/(double)k + r - d <= 5e-17 && (double)(int)(k*r)/(double)k != (double)p/q && yfp((int)(k*r),k) <= m) ||
			 ((double)(int)(k*r+1)/(double)k - r - d <= 5e-17 && (double)(int)(k*r+1)/(double)k != (double)p/q && yfp((int)(k*r+1),k) <= m))) b = 1;
	}
	if (b) printf("TOO MANY\n");
//	else if (p == 0) printf("0/1");
	else printf("%d/%d\n", p, q);
//	printf("%d/%d", p, q);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...