jzoj礼物【数论】

>Description
N个礼品盒分别用整数1-N进行编号。其中,编号为1的盒子中有一个糖果,编号为2的盒子中有2个糖果,……编号为N的盒子中有N个糖果。问有多少种方案使两个盒子中的糖果加起来为K的倍数。


>Input
每行两个正整数N和K,其中1<=N<=109,1<=K<=109。
一行0 0表示输入结束,这一行不用处理。

>Output
对输入中除了N=K=0外的每一行,输出一行,这一行只有一个数,即其相对应的输入所得到的方案数。


>Sample Input
1 1
3 2
5 2
50 50
0 0

>Sample Output
0
1
4
24


>解题思路
lyf巨佬nb啊%%%

↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
数论搞得我秃头
需要细心

由于我爸妈来了所以打得比较简略


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll n,k,l,s,mid,ans;
int main()
{
//	freopen("gift.in","r",stdin);
//	freopen("gift.out","w",stdout);
	while(1)
	{
		scanf("%lld%lld",&n,&k);
		if(n==0&&k==0) return 0;
		l=n/k;
		s=n%k;
		mid=(k-1)/2; //记录每一份的中间
		ans=l*(l-1)/2+l*l*mid;
		if((k-1)%2==1) ans+=l*(l-1)/2;
		if(s<mid) ans+=l*s,s=0;
		if(s>=mid) ans+=l*mid,s-=mid;
		if(s>0&&(k-1)%2==1) ans+=l,s--;
		if(s>0) ans+=s*(l+1);
		printf("%lld\n",ans);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值