qduoj 一道非常簡單的簽到題
阿新 • • 發佈:2019-02-15
一道非常簡單的簽到題
釋出時間: 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; }