1. 程式人生 > >qduoj 一道非常簡單的簽到題

qduoj 一道非常簡單的簽到題

一道非常簡單的簽到題

釋出時間: 2016年7月2日 20:32   最後更新: 2016年7月2日 21:48   時間限制: 1000ms   記憶體限制: 128M

給你k,a,b三個數,問[a,b]區間內有多少個數可以整除k。(n / k == 0)

多組輸入,即輸入包括多行,每行三個數k,a,b。 其中1 ≤ k ≤ 10^18,-10^18 ≤ a ≤ b ≤ 10^18。

輸出包含多行,每行對應題目所要求的結果。

 複製
1 1 10
2 4 16
10
7

思路

某學長出的超坑的題,之前做的很快就過了。。。現在做想半天都沒想起來怎麼做,wa了好多次。。

思路:首先遍歷是肯定不行的,要根據a和b的值來找,先看a,b都是正數時,a/k表示1到a裡(閉區間)有多少個能整除k的,b/k表示1到b裡(閉區間)有多少個能整除k的,

那a到b區間裡有多少個能整除k的呢??直接相減,但要特殊考慮一下a的情況,因為是閉區間;(當然也可以直接用(a-1)/k,但有些情況也要特殊考慮一下);a為負數,b為正數的時候,顯然直接減就好;都為負數則要特殊考慮一下b

因此可以看出,當同為正或同為負時,要特殊考慮一下靠近零的,寫幾個資料想想可以了

分享幾個資料: 4 3 9         4 -1 4         4 -8 -4        4 -5 -4        9 10 100       9 9 100        9 10 99          9 9 99      2 0 0

#include<stdio.h>
long long int k,a,b,ans,n;
int main()
{

	while(~scanf("%lld %lld %lld",&k,&a,&b))
	{
		ans=(b/k)-(a/k);
		if(a>=0)
		{
			if(a%k==0)
			ans++;
		}
		else if(a<0&&b>0)
		{
			ans++;
		}
		else
		{
			if(b%k==0)
			ans++;
		}
		printf("%lld\n",ans);
	}
	return 0;
}