题目概述
给定N和M,求满足以下条件的整数对(a,b)的数量,其一,0< a< b< N,其二,(a^2+b^2+M)/(ab)为整数
输入
第一行正整数times,其后有times块数据,每块数据由若干行组成,每行两个整数N,M,每块数据以0 0结束
限制
0
输出
每组输出格式为Case #: @,其中#为数据在该块的序数,@为所求数量,两组输出之间没有空行,两块数据的输出之间有一个空行
样例输入
2
10 1
20 3
30 4
0 010 1
20 3
30 4
0 0
样例输出
Case 1: 2
Case 2: 4
Case 3: 5Case 1: 2
Case 2: 4
Case 3: 5
讨论
题目本身毫无难度,不是深搜,是暴搜,两层循环的事情,只是题目原文描述没讲清楚格式,可能导致各种花样WA
题解状态
265MS,1720K,767 B,C++
题解代码
#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx(a,b) ((a)>(b)?(a):(b))
#define minn(a,b) ((a)<(b)?(a):(b))
#define MAXN 21
#define memset0(a) memset(a,0,sizeof(a))
#define EPS 1e-6
int N, M;
int kase = 0;
void fun()
{
int cnt = 0;
for (int a = 1; a < N; a++) {
for (int b = a + 1; b < N; b++)
if (double(a*a + b*b + M) / double(a*b) - (a*a + b*b + M) / (a*b) < EPS)//以浮点型与由整型提升所得的浮点型作差 小数部分在浮点误差之内则视为整数
cnt++;
}
printf("Case %d: %d\n", ++kase, cnt);
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);
int times;
scanf("%d", ×);
while (times--) {
while (scanf("%d%d", &N, &M) && (N || M))
fun();
kase = 0;//每块数据的序号是不共用的
if (times)
printf("\n");//新的控制输出间空行方法 不用再插旗了
}
}
EOF