社区讨论

这样写在考场会不会锅啊

P2518[HAOI2010] 计数参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7cha89
此快照首次捕获于
2025/11/20 19:25
4 个月前
此快照最后确认于
2025/11/20 19:25
4 个月前
查看原帖
这道题因为会爆long long,但是答案在longlong范围内用long double 暂时代替longlong 然后进行一般求解,(请务必看到代码中的define) 我不知道这样写会不会锅但是评测过了 有哪位大佬给出回答.
CPP
#include<bits/stdc++.h>
#define int long double
#define per(x,y,z) for(signed x=y;x<=z;x++)
using namespace std;
long long ton[10],n,cnt,res[120];
int c[120][120]={1},mul[120]={1},p;string a;
signed main(){
    cin>>a,n=a.length();per(i,1,n){
     a[i-1]^=48;if(a[i-1]==0)cnt++;
     ton[a[i-1]]++,res[a[i-1]]++;
     mul[i]=mul[i-1]*i,c[i][0]=1;
     per(k,1,i)c[i][k]+=c[i-1][k-1]+c[i-1][k];
    }
    
    int y=1;per(i,1,9)if(ton[i])y*=mul[ton[i]];
    per(i,0,cnt-1)p+=c[n-(cnt-i)-1][i]*(mul[n-cnt]/y);
    per(i,0,n-2){
        per(k,0,a[i]-1){
            if(!res[k]||(i==0&&k==0))continue;y=mul[n-i-1];
            per(j,0,9)if(j!=k&&res[j])y/=mul[res[j]];
            if(res[k]-1)y/=mul[res[k]-1];p+=y;
        }
        res[a[i]]--;
    } 
    cout<<((long long)p);//阶乘爆longlong 巧妙的long double 
}//带重复元素全排列计算方法为元素总个数的阶乘除以各个元素个数阶乘之积。

回复

2 条回复,欢迎继续交流。

正在加载回复...