D. Triangle Coloring (组合数)

复制代码
#pragma GCC optimize ("O3")
#pragma GCC optimize ("O2")
#pragma GCC optimize ("O1")
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
const ull base1 = 131;
const ull base2 = 13331;
const ll N = 3e5 + 5, M = 9e18 ;
#define PI 3.141592653589793
ll mod=998244353LL,mod2=1000000007;
using namespace std;
//组合数板子
ll fac[N], ifac[N];
ll qmi(ll a,ll k,ll p)
{
    ll res=1;
    while(k){
        if (k&1) res=(res*a)%p;
        a=(a*a)%p;
        k>>=1;
    }
    return res%mod;
}
void init(){
    fac[0]=ifac[0]=1LL;
    for (ll i=1;i<N;i++){
        fac[i]=(fac[i-1]*i)%mod;
        ifac[i]=(ifac[i-1]*qmi(i,mod-2,mod))%mod;
    }
}
ll C(ll n,ll m){
    if(m>n) return 0;
    return ((fac[n]*ifac[m])%mod*ifac[n-m])%mod;
}
//组合数板子
void solve(){
    int n;cin>>n;
    vector<ll> a(n+3);
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    ll ans=1;
    for(int i=1;i<=n;i+=3){
        sort(a.begin()+i,a.begin()+i+3);
        if(a[i]==a[i+1]&&a[i+1]==a[i+2]) ans*=3;
        else if(a[i]==a[i+1]) ans*=2;
        ans%=mod;
    }
    ans*=C(n/3,n/6);ans%=mod;
    cout<<ans<<"\n";
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);std::cout.tie(0);
    init();
    solve();
}
复制代码

只需要分类三元组内能达到最大值的两条边的数量,最后乘上C(n/3,n/6)即可

posted on   zesure  阅读(60)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示