2020牛客寒假算法基礎集訓營2題解 E題:做計數【數學題,時間複雜度:O( n )】

題目

鏈接:https://ac.nowcoder.com/acm/contest/3003/E

這一天,牛牛與 牛魔王相遇了――然而這並不在 牛牛期望之中。
牛魔王不出意料又給 牛牛一道看似很難的題目:求有多少個不同的正整數三元組 (i,j,k) 滿足
sqrt(i)+sqrt (j)=sqrt (k)
,且 i×j≤n。
牛牛並不會做,你能略施援手嗎?
不相等的ij互換位置相當於一個新的答案;

樣例

輸入:1
輸出:1
(1,1,4)

拿到式子,想到ij<=n,那麼就兩邊平方:
i + j +2sqrt(ij)=k;
也就是說,sqrt(ij)爲整數,也即是ij等於mm,(mm<=n)

那麼我們就可以知道了,只要i乘j結果是某方,ij就是可以的,舉例子ij分別爲2,8,ij=16,爲4^2,所以滿足條件,我們只需要枚舉m,然後求m*m的因子數,有多少個因子就有多少個ij組合:

代碼比較短:

scanf("%d",&n);
	int ans=0;
	for(int time=1;time*time<=n;time++)
	{
		int yinzi=0;
		for(int time1=1;time1<=time;time1++)
		{
			if((time*time)%time1==0)
			{
				if(time1!=time)yinzi+=2;
				else yinzi++;
			}
		}
		ans+=yinzi;
		//printf("%d %d %d\n",time,yinzi,ans);
	}
	printf("%d\n",ans);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章