CodeForces 597A(公式+技巧)

I - Divisibility
Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u
Submit  Status  Practice  CodeForces 597A

Description

Find the number of k-divisible numbers on the segment [a, b]. In other words you need to find the number of such integer values x thata ≤ x ≤ b and x is divisible by k.

Input

The only line contains three space-separated integers ka and b (1 ≤ k ≤ 1018; - 1018 ≤ a ≤ b ≤ 1018).

Output

Print the required number.

Sample Input

Input
1 1 10
Output
10
Input
2 -4 4
Output
5

方法1:
思路:
  简单的思路,就是先从a开始,找到第一个能被k整除的数t,然后跟b比较,如果比b大,那么就不存在,输出0,否则的话就看从k到b有多少个k,结果输出k+1;
  但是在找第一个能被k整除的数的时候,要分a是正数还是负数,如果是正数的话,就直接在a的基础上加上k-a%k(也就是大于a能够取余k的最小的数);
如果是负数的话,用a加上多余的那部分(-a%k),就将那部分给抵消了(满足 大于a能够取余k的最小的数),按照上面的方法就能做出来了!
代码:
//A了 
#include 
#include 
#include 
using namespace std;
int main()
{
	__int64 k,a,b;
	while(scanf("%I64d%I64d%I64d",&k,&a,&b)!=EOF)
	{
		__int64 t,u;
		u=a%k;
		if(u==0)
		{
			t=a;
		}
		else
		{
			if(u<0)
			{
				u=-u;
				t=a+u;//因为负的时候是将它的余数往上加的才能是大于a的, 
			}//负数应该和正数是对称的!!! 
			else
			{
				t=a+(k-u);
			}	
		}
		if(t<=b)
		{
			__int64 sum=1;
			sum+=(b-t)/k;
			printf("%I64d\n",sum);
		} 
		else
		{
			printf("0\n");
		}
	}
	return 0;
}

方法2:
思路:
因为在0<=a<=b的时候有这个公式sum=b/k-(a-1)/k;所以我们可以想办法将其他区间也转化成这种情况;
总共有三种情况:a>0&&b>0 sum= b/k-(a-1)/k;
               a<0&&b<0 sum=-a/k-(-b-1)/k;
               a<=0&&b>=0 sum=-a/k+1+b/k;
代码:
#include 
#include 
#include 
#define INF 1000000000000000000
using namespace std;
int main()
{
	__int64 k,a,b;
	while(scanf("%I64d%I64d%I64d",&k,&a,&b)!=EOF)
	{
		__int64 sum;
		if(a>0&&b>0)
			sum=b/k-(a-1)/k;
		else if(a<0&&b<0)
		{
			sum=-1*a/k-(-1*b-1)/k;
		}
		else if(a<=0&&b>=0)
		{
			sum=-1*a/k+1+b/k;
		}
		printf("%I64d\n",sum);
	}
	return 0;
}


你可能感兴趣的:(其他oj氺题)