题意:有 n 个钉子,标号 1∼n,以正 n 边形的顶点形状排列,正中间有一个较小的钉子。初始时一个橡皮筋绕着这 n 个顶点,每次可以任意拿走一个钉子(除了中间的特殊钉子),直到橡皮筋碰到中间的钉子时停止。特殊地,在 n 为偶数时正对面的两个钉子缠绕不会碰到中间的钉子(因为较小)。求拿走钉子的方案数(考虑顺序)。
namespace run{ Z fac[5005],inv[5005],invf[5005]; Z C(int a,int b){return fac[a]*invf[b]*invf[a-b];} boolmain(){ int n; read(n,p); fac[0]=fac[1]=inv[1]=invf[0]=invf[1]=1; for(int i=2;i<=n;++i){ fac[i]=fac[i-1]*i; inv[i]=(p-p/i)*inv[p%i]; invf[i]=inv[i]*invf[i-1]; } Z ans(0); for(int i=1;i<=n-(n>>1);++i){ Z c=0; for(int l=i+1;l<=n;++l)if(l-i-1<(n>>1) && (n-l)<(n>>1)){ ++c; } c*=n; Z v=0; if(i==1)v=fac[n-2]; else{ for(int j=0;j<=i-2;++j)v+=C(i-2,j)*fac[n-3-j]; } ans+=v*c; } write(ans.x,'\n'); return0; } }
E. Doremy’s Number Line
题意:有一个整数数轴,初始每个点都没有颜色。你有 n 种操作,第 i 种操作有两个属性 ai,bi。进行操作时,你可以选择一个没涂色的位置 x 涂上颜色 i,要求:要么 x≤ai,要么存在一个涂过色的 y≤ai 且 x≤y+bi。你可以以任意顺序执行这些操作,但每种最多一次,问是否能将 k 染成颜色 1。