qduoj 韬韬说蛤蛤蛤

韬韬说蛤蛤蛤

发布时间: 2015年12月7日 13:53   最后更新: 2015年12月12日 23:11   时间限制: 1000ms   内存限制: 128M

描述

   从前有一只蛤,no,Frog,它too young too simple, sometimes naïve。

   蛤,哦不,Frog,最喜欢做的一件事情就跳石头,嘛,蛤在河的这一岸,另一只蛤在河的另一岸,这只蛤想和另一个蛤见面,- - 见面干什么呢。韬韬说我也不知道,咦?你们要知道这个干嘛呀。

   蛤当然可以通过石头跳过河啦,只要跳跳跳就能跳过去啦,但是蛤们觉得这太无聊了,蛤要玩个有趣の游戏。于是他们找到了韬韬,韬韬说你们真是naïve呀,这个简单呀。

   泥只要召集一群蛤,然后每个人都跳跳跳,看能不能把每个石子都跳过一遍。

蛤们一想,噫,这个游戏好简单啊,我们每个人的弹跳力都不一样,得都跳跳才知道,但是找到一个能跳1个石子的,就一定能跳完呀。

   韬韬心想,看来不搞个难的你们是不会罢休了,把河里的石子摆成一个环形,石子共有N个,分别编号0~N-1,假设你们蛤中的一只开始在0号石头,一次可以跳K步,沿着环可以一直跳啦,但是泥萌会发现有些石头怎么也跳不到,泥萌可以告诉我这些不能跳到的石头的编号的总和嘛?

输入

第一行是测试样例数t (1 <= t <= 100) 接下来t行每行包括两个正整数n 和 k。 数据范围1 <= n <= 10^9 , 1 <= k <= 100

输出

输出包括t行,每行包括不能跳到的石子编号的总和。

样例输入1  复制
2
9 6
4 3
样例输出1
27
0

水题,画一下找找规律就好了

n和k最大公约数是1的时候总和肯定为零,不为一的时候会出现一种间隔为公约数的跳步循环,就像n=4,k=2,就会出现0->2->0->2...

那怎么求没跳到的和呢,列一个更为形象的例子就知道怎么求了

n=9,k=3

0->3->6->0->3.....

0 1 2 3 4 5 6 7 8 

所有的总和减去红色数字的总和

#include
long long int gcd(long long int a,long long int b)
{
	if(b==0)
	return a;
	return gcd(b,a%b);
}
int main()
{
	long long int k,sum,sum1,a,n,t,c;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld %lld",&n,&k);
		c=gcd(n,k);
		//printf("%lld\n",c);
		if(c==1)
		sum=0;
		else
		{
			sum=(n*(n-1))/2;
			n--;
		//	printf("%lld\n",sum);
			a=n-(n%c);                                                                                                                                                                                                                                                                                                                                                                                                                                  
			sum1=(a*(a/c+1))/2;
			sum-=sum1;
		}
		printf("%lld\n",sum);
	}
	return 0;
}




你可能感兴趣的:(qduoj,水题)