计蒜客信息学入门赛 #18--D

D:

思路:

1.递推;2.判断直角三角形的一边,不一定是最大的边,一定是存在一个直角边或者斜边为整数;

3.dp数组开辟空间为MAX_N*MAX_N;

#include<iostream>
#include<cstring>
#include<cstdio> 
#include<algorithm>
#include<cmath>
using namespace std;
const int maxa=1000*1000;
int dp[maxa];
int a,b;
bool check(double x){
	double a=sqrt(x);
	return a==(int)(a)?true:false;
}
void init(){
	dp[0]=0,dp[1]=1,dp[2]=2;
	for(int i=3;i<=maxa;i++){ 
		dp[i]=dp[i-1]+dp[i-2];
		dp[i]=dp[i]%10007; 
	} 
}
int main(){
	init();
	while(cin>>a>>b){
		if(check(a*a+b*b))	printf("%d\n",dp[(int)(sqrt(a*a+b*b))]);
		else if(check(max(a,b)*max(a,b)-min(a,b)*min(a,b)))	printf("%d\n",dp[(int)(sqrt(max(a,b)*max(a,b)-min(a,b)*min(a,b)))]);
	}
}
发布了226 篇原创文章 · 获赞 90 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/queque_heiya/article/details/105310673