1. 程式人生 > >SICAU-OJ: 三角關係

SICAU-OJ: 三角關係

三角關係

題意:

給出兩個數n和k,統計(a,b,c)三元組滿足(a+b)%k=0,(b+c)%k=0,(a+c)%k=0且1<=a,b,c<=n的數量。

 

題解:

由(a+b)%k=0,(b+c)%k=0,(a+c)%k=0我們可以知道,a,b,c要麼都為k的整數倍,要麼當他們模上k時餘數為k/2。

我們現在來考慮f(n,3),即從不大於n的數裡面選出可重複的3個數滿足條件的個數。

首先我們可以知道k的整數倍有cnt1 = n/k 個數,然後第二種情況有cnt2 = n/k+(n%k>=k/2)個數(前提是k為偶數)。

因為我們是從中選數,所以是n%k>=k/2。

對於第一種情況,不論k的奇偶都會貢獻給答案。而第二種情況只有當k為偶數時才被貢獻給答案。

統計結果時就分別考率選三個不同的丶選兩個相同的以及三個都相同的情況,最後加起來就是了。

 

程式碼如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N =1e5+5;
ll n,k,ans;
int main(){
    cin>>n>>k;
    int cnt1 = n/k;
    int cnt2 = n/k+(n%k>=k/2
); ans=(ll)cnt1*(cnt1-1)*(cnt1-2)+3ll*(cnt1-1)*cnt1+cnt1; if(k%2==0) ans+=(ll)cnt2*(cnt2-1)*(cnt2-2)+3ll*(cnt2-1)*cnt2+cnt2; cout<<ans; return 0; }