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;
}
posted @ 2020-11-17 21:49  ullio  阅读(78)  评论(0)    收藏  举报