>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;
}