题解 ARC106F【Figures】/ SS230912A【圣诞树】
problem
提示:本题输入量较大,请采用较快的读入方式
圣诞节到了,小P很孤独。
他只有一棵光秃秃的圣诞树,所以他决定玩玩它。不幸的是,这棵树被玩坏了,所以小P想将它复原。
小P的圣诞树是一棵
小P需要用
定义两棵树相同当且仅当对于每一条边,它插入的两个孔在两棵树中相同,详见样例解释。
solution
考虑 prufer 序列,设
前面那一坨是常数,扔掉;后面那一坨如果要枚举
code
点击查看代码
int main(){
// #ifdef LOCAL
// freopen("input.in","r",stdin);
// #endif
freopen("tree.in","r",stdin),freopen("tree.out","w",stdout);
scanf("%d%u",&n,&P);
mint ans=1;
for(int i=1,x;i<=n;i++) scanf("%d",&x),ans*=x,dsum+=x;
for(int i=1;i<=n-2;i++) ans*=dsum-n-i+1;
printf("%d\n",raw(ans));
return 0;
}
考场上没有发现
//O(mlnm)
#include <cassert>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
unsigned P;
struct modint{
unsigned v; modint():v(0){}
template<class T> modint(T x):v((x%int(P)+int(P))%int(P)){}
modint operator-()const{return modint(P-v);}
modint&operator+=(const modint&rhs){if(v+=rhs.v,v>=P) v-=P; return *this;}
modint&operator-=(const modint&rhs){return *this+=-rhs;}
modint&operator*=(const modint&rhs){v=1ull*v*rhs.v%P; return *this;}
friend int raw(const modint&self){return self.v;}
friend modint qpow(modint a,LL b){modint r=1;for(;b;b>>=1,a*=a) if(b&1) r*=a; return r;}
friend modint operator+(modint lhs,const modint&rhs){return lhs+=rhs;}
friend modint operator-(modint lhs,const modint&rhs){return lhs-=rhs;}
friend modint operator*(modint lhs,const modint&rhs){return lhs*=rhs;}
friend bool operator==(const modint&lhs,const modint&rhs){return lhs.v==rhs.v;}
friend bool operator!=(const modint&lhs,const modint&rhs){return lhs.v!=rhs.v;}
};
typedef modint mint;
int n;
LL dsum=0,a[1<<20];
int cnt[1<<20];
bool isp[1<<20];
int divide(LL &x,int p){
int res=0;
while(x%p==0) x/=p,res++;
return res;
}
void sieve(int m){
memset(isp,1,sizeof isp),isp[1]=0;
for(int i=2;i<=m;i++) if(isp[i]){
cnt[i]--;
for(int j=i+i;j<=m;j+=i){
LL k=j;
cnt[i]-=divide(k,i),isp[j]=0;
}
}
}
mint binom(LL n,int m){
//n<=1e12,m<=1e6
debug("binom(%lld,%d)\n",n,m);
// mint up=1,dw=1;
// for(int i=n;i>n-m;i--) up*=i;
// for(int i=1;i<=m;i++) dw*=i;
// return up*qpow(dw,P-2);
//[n-m+1,n]
for(int i=1;i<=m;i++) a[i]=n-m+i;//,debug("a[%d]=%lld\n",i,a[i]);
sieve(m);
//for(int i=1;i<=m;i++) debug("cnt[%d]=%d\n",i,cnt[i]);
for(int i=1;i<=m;i++) if(isp[i]){
int st=LL((n-m)/i+1)*i-(n-m);
//assert(a[st]%i==0);
for(int j=st;j<=m;j+=i) /*assert(a[j]%i==0),*/cnt[i]+=divide(a[j],i);
}
mint ans=1;
for(int i=1;i<=m;i++) ans*=a[i]*qpow(mint(i),cnt[i]);//,debug("a[%d]=%lld,cnt[%d]=%d\n",i,a[i],i,cnt[i]);
return ans;
}
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/solution-SS230912A.html
分类:
solution
标签:
combinatorics
, trees
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现