Atcoder ABC RGB(組合數學:乘法原理+容斥,枚舉排除)

D - RGB Triplets

在這裏插入圖片描述
在這裏插入圖片描述

題意:

要求你找到三元的組合。有兩個條件

  1. 每個三元組合由R ,G ,B構成
  2. i,j,k不能成等差。

思路:

  1. 因爲每個三元組裏的元素沒要求,所以組合數學中的乘法原理即可。
  2. 之後再枚舉排除不滿足的情況(i,j,k等差情況)

反思

  1. 位運算的優先級巨低,(要加括號)

AC

#include <iostream>
#include <cstring>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
#define foR(i,x,y) for(register int i=(x); i>=(y); i--)
using namespace std;
const int maxn=4e3+10;
typedef long long ll;
char s[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    cin>>s+1;
    ll cnt1,cnt2,cnt3,ans=0;
    cnt1=cnt2=cnt3=0;
    For(i,1,n)
    {
        if(s[i]=='R')cnt1++;
        else if(s[i]=='G')cnt2++;
        else cnt3++;
    }
    ans=cnt1*cnt2*cnt3;
    For(i,1,n)
    {
        for(int j=1; i+j+j<=n; j++)
        {
            if((s[i]^s[i+j]^s[i+j*2])==('R'^'G'^'B'))ans--;
        }
    }
    cout<<ans<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章