1. 程式人生 > >hdu 4473 exam數論第一場基礎演算法

hdu 4473 exam數論第一場基礎演算法

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; 
}