三元組


也許更好的閱讀體驗
\(\mathcal{Description}\)

給定 \(n,k\),對於一 個三元組\((a, b, c)\),若合法則需要滿足\(1 ≤ a, b, c ≤ n\),且兩兩元素之和均為\(k\)的倍數。
求不同的合法的三元組有多少個。
三元組的相應的任意一 位不同則認為他們不同。
\(\mathcal{Solution}\)

\(a=x_1k,b=x_2k,c=x_3k\)
\(x1,x2,x3\in [0,n/k]\) (包括小數)
則有
\(a+b=(x_1+x_2)k\)
\(b+c=(x_2+x_3)k\)
\(a+c=(x_1+x_3)k\)

\(x_1+x_2\in Z\)
\(x_2+x_3\in Z\)
\(x_1+x_3\in Z\)
所以可以知道

  • \(x1,x2,x3\in Z\)
    \(x1,x2,x3\)\(n/k\)種選擇
    • 當三個數字全部不相同 有\(C_{n/k}^3\)種搭配,每種搭配有6種排列方式
    • 當三個數字有兩個相同 有\(C_{n/k}^2\)種搭配,每種搭配有6種排列方式
    • 當三個數字全部都相同 有\(n/k\)種搭配,每種搭配有1種排列方式
  • \(x1,x2,x3∉ Z\)
    \(\because x1,x2,x3\)兩兩相加為整數
    \(∴x1,x2,x3=ik+\frac{k}{2},i\in Z\)
    此時條件\(k\%2==0\)
    \(x1,x2,x3\)\(n/\frac{k}{2}-n/k\)種選擇
    接下來的計算同上

代碼

/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年06月13日 星期四 08時19分25秒
*******************************/
#include <cstdio>
#include <fstream>
#define ll long long
using namespace std;
int n,k,tim,hal;
ll ans;
ll C3 (int n) { return 1ll*n*(n-1)/2*(n-2)/3; }
ll C2 (int n) { return 1ll*n*(n-1)/2; }
int main()
{
	scanf("%d%d",&n,&k);
	tim=n/k;
	if ((k-1)&1){
		hal=n/(k/2)-tim;
		ans+=6*C3(hal)+6*C2(hal)+hal;
	}
	ans+=6*C3(tim)+6*C2(tim)+tim;
	printf("%lld\n",ans);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM