一道非常简单的签到题
发布时间: 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。
输出包含多行,每行对应题目所要求的结果。
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;
}