A Mathematical Curiosity hdu1017

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 46725    Accepted Submission(s): 15013


Problem Description
Given two integers n and m, count the number of pairs of integers (a,b) such that 0 < a < b < n and (a^2+b^2 +m)/(ab) is an integer.

This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.
 

Input
You will be given a number of cases in the input. Each case is specified by a line containing the integers n and m. The end of input is indicated by a case in which n = m = 0. You may assume that 0 < n <= 100.
 

Output
For each case, print the case number as well as the number of pairs (a,b) satisfying the given property. Print the output for each case on one line in the format as shown below.
 

Sample Input
 
  
1 10 1 20 3 30 4 0 0
 

Sample Output
 
  
Case 1: 2 Case 2: 4 Case 3: 5
题意:先给一个数N,表示N大模块(即每个模块的用例从1开始算)

对于一个模块中每行给出n,m 计算这个case中有多少a,b满足给的式子,要求0<a<b<n

按格式输出,每个模块以n==0&&m==0结束,结束后需再输出一个空格

这道题特别有意思的是如果判断那一行if((a*a+b*b+m)%(a*b)==0);改成 if((int)(pow(a,2)+pow(b,2)+m)%(a*b)==0)(加上了头文件cmath)

运行时间就会从103ms左右变成超时,欢迎大家留言

#include <iostream>

#include <algorithm>

using namespace std;
int main()
{    
  int N; cin>>N;
while(N--)
{

int cnt=1;
int n,m;
while(cin>>n>>m)
{
if(!n&&!m)
break;
int a,b,ans=0;
for(int a=1;a<n-1;a++)
   for(int b=a+1;b<n;b++)
       {
        if((a*a+b*b+m)%(a*b)==0)
        ans++;
}
printf("Case %d: %d\n",cnt++,ans);
}
if(N)  
            printf("\n");  
  }
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41603898/article/details/80199806