arc102a
arc102a
大意
给定 \(N,K\) ,求满足 \(K\mid a+b\ \ ;\ K\mid b+c\ \ ;\ K\mid a+c\) 且 \(a,b,c\leq N\) 的三元组 \((a,b,c)\) 的个数。
所有数都为正整数。
思路
显然,当三元组 \((a,b,c)\) 为一组解, \((a+xK,b+yK,c+zK)\) 也为一组解。
实际上,若 \(a,b,c\) 都为正整数,且 \((a+xK,b+yK,c+zK)\) 为一组解,则 \((a,b,c)\) 也一定为一组解。
将式子代入条件容易得到。
所以只需要找出所有小于等于 \(K\) 的解,其他的通过组合递推就能得到。
等于 \(K\) 时,显然成立。
小于 \(K\) 时,显然要有 \(a+b=b+c=c+a=K\)
此时若 \(K\) 是奇数显然无解,当 \(K\) 是偶数时,能得到一组解 \((\dfrac{K}{2},\dfrac{K}{2},\dfrac{K}{2})\)
从小于等于 \(K\) 的解出发考虑,因为 \(a,b,c\) 的值在加 \(K\) 的过程中互不影响,所以运用乘法原理即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
ull n, k;
ll p(ll x) {return x*x*x;}
int main() {
cin >> n >> k;
if(k%2) {
cout << p(n/k);
} else {
cout << p(n/k) + p((n/(k>>1)+1)>>1);
}
return 0;
}

浙公网安备 33010602011771号