hdu 4473 exam数论第一场基础算法

版权声明:小媛原创,转载请注明出处! https://blog.csdn.net/xingfushiniziji/article/details/85051598

hdu 4473 exam 数论
注意数据大小,要用long long int


//这道题主要就是转换思路
//一开始完全不知道说啥呢,就是只知道这是一道数论相关的题 
//想到这就开始转换思路,(a*b)|n=c,其实就是a*b*c=n; 
//分三种情况,第一种3个数相等,第二种2个数相等,第三种三个数均不等 
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
	long long int n,x=1,coun=0;
	while(~scanf("%lld",&n)){
		coun=0;
		long long int k;
		for(long long int i=1;i*i*i<=n;i++) coun++;
		for(long long int i=1;i*i<=n;i++){
			k=n/i/i;
			if(k>=i) coun+=3*(k-1);//因为k不能等于i,所以减掉一种情况
			else
			coun+=3*k; 
		}
		for(long long int i=1;i*i*i<=n;i++){
			for(long long int j=i+1;j<=n;j++){
				k=n/i/j;
				if(k>j) coun+=(k-j)*6;
				else break;//如果不满足k>j的话一定是有重复的,就不是这种三个各不相同情况 
			}
		}
		printf("Case %lld: %lld\n",x++,coun);
	}
	return 0; 
}







猜你喜欢

转载自blog.csdn.net/xingfushiniziji/article/details/85051598