抱灵求助,代码带注释方便理解
查看原帖
抱灵求助,代码带注释方便理解
264548
Tangent233楼主2020/7/28 11:44
/*
开一个桶a,统计对应长度的木棍的数量
读入的过程计算最大值max
然后数据全部读入过后再开一个数组temp每一位计算从a[1]加到a[n]的值
然后从1到max用i循环,每次方案数都加C(a[i],2)%mod*(temp[i*2-1]-2)%mod
但是当所有木棍长度都相同时 方案数就是C(n,3)
*/
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
int a[200010],temp[200010];
long long c[200010];
long long an=0,zl=0;
int max1=-100;
long long fac(int m)//求m的阶乘
{
    long long ans=1;
    for(int i=1;i<=m;i++) ans=ans*i%mod;
    return ans;
}
long long C(int n,int m)//从n项中选出m项
{
    c[n]=fac(n)/(fac(n-m)*fac(m));
    return c[n];
}
int main()
{
    int n,last;cin>>n;
    bool same=1;
    for(int i=1;i<=n;i++)
    {
        int k;cin>>k;
        a[k]++;//桶
        max1=max(k,max1);//打擂求最大
        if(i==1) last=k;
        else
        {
            if(last!=k) same=0;
        }//判别是否所有木棍长度都相同
    }
    long long qzh=0;
    for(int i=1;i<=200010;i++)
    {
        qzh+=a[i];
        temp[i]=qzh;
    }//前缀和处理
    if(same==0){
        for(int i=1;i<=max1;i++)
        {
            if(temp[i*2-1]-2<0) zl=0;
            else
            {
                if(a[i]>=3){
                    zl=C(a[i],2)%mod*(temp[i*2-1]-a[i])%mod+1;
                }
                else{
                    zl=C(a[i],2)%mod*(temp[i*2-1]-2)%mod;
                }
            }
            an+=zl;
        }//公式,但是所有的等边三角形只能取一个
    }
    else{
        an=C(n,3)%mod;
    }//特判
    cout<<an;
    return 0;
}

样例都调过了但是还是不知道为什么全错

2020/7/28 11:44
加载中...