【Codeforces Testing Round 12A】【討論 邊界元素對映】Divisibility 區間範圍內k倍數的數的個數
阿新 • • 發佈:2019-02-09
A. Divisibility
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Sample test(s)
input
Find the number ofk-divisible numbers on the segment[a, b]. In other words you need to find the number of such integer valuesxthata ≤ x ≤ bandxis divisible byk.
InputThe only line contains three space-separated integersk,aandb(1 ≤ k ≤ 1018; - 1018 ≤ a ≤ b ≤ 1018).
OutputPrint the required number.
1 1 10output
10input
2 -4 4output
5
#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T> inline void gmax(T &a,T b){if(b>a)a=b;} template <class T> inline void gmin(T &a,T b){if(b<a)a=b;} const int N=0,M=0,Z=1e9+7,ms63=1061109567; LL a,b,k; int main() { while(~scanf("%lld%lld%lld",&k,&a,&b)) { LL lft=a/k;if(a>0&&a%k)++lft; LL rgt=b/k;if(b<0&&b%k)--rgt; printf("%lld\n",rgt-lft+1); } return 0; } /* 【題意】 給你一個模數k(1<=k<=1e18), 然後再給你一個區間[a,b](-1e18<=a<=b<=1e18), 問你這個區間內有多少個數,使得這個數為k的倍數。 【型別】 討論 【分析】 第一個想法是,我們求出區間長度a-b+1,然後看這個區間長度是k的幾倍。 然而,問題很顯然。比如說k=5,我們一個長度為6的區間內,k倍數的數可能是1個或2個。 對於區間[0,5],k倍數的數為2個;對於區間[1,6],k倍數的數只有1個。 於是我們發現,我們還需要特殊判定,處於邊界位置的k倍數的數。 既然如此,我們不妨直接對映到邊界位置的k倍數的數—— LL lft=a/k;if(a>0&&a%k)++lft;//最左的第一個數是lft LL rgt=b/k;if(b<0&&b%k)--rgt;//最右的第一個數是rgt printf("%lld\n",rgt-lft+1);//答案就是rgt-lft+1 做完嘍!邊界對映的思想棒棒噠! */