圣诞,圣诞,圣诞节!
「启」
立冬就下暴雪,好。
随便写一下,因为 C 和 D 都不想写代码了,所以就快快口胡一下吧。
缺省源使用:「V5.2」。
「A」
按照 %m
来统计方案数,每次用矩阵来转移。
CI NXX(101),MXX(21),MOD(1e9+7);
struct Matrix
{
int n,m,a[MXX][MXX];
Matrix()
{
n=m=0,mst(a,0);
}
I void Build()
{
for(int i(1);i<=m;++i)
a[i][i]=1;
}
I Matrix operator * (const Matrix &co) const
{
Matrix res;
res.n=n,res.m=co.m;
for(int i(1);i<=n;++i)
for(int k(1);k<=m;++k)
for(int j(1);j<=co.m;++j)
(res.a[i][j]+=(1ll*a[i][k]*co.a[k][j])%MOD)%=MOD;
Heriko res;
}
}
ans;
int n,m;
I Matrix MFP(Matrix x,int y)
{
Matrix res;
res.n=res.m=m;
res.Build();
while(y)
{
if(y&1)
res=res*x;
x=x*x;
y>>=1;
}
Heriko res;
}
S main()
{
Files();
fr(n),fr(m);
ans.n=1,ans.m=m;
ans.a[1][m]=1;
for(int i(1);i<=n;++i)
{
int x,y;
fr(x),fr(y);
Matrix tmp;
tmp.n=tmp.m=m;
for(int j(1);j<=m;++j)
++tmp.a[j][j],++tmp.a[j][(j+y-1)%m+1];
ans=MFP(tmp,x)*ans;
}
fw((ans.a[1][m]+MOD-1)%MOD,1);
Heriko Deltana;
}
「B」
结论题,好像有很多人是直接上了平衡树(
但是其实玩一玩就能发现,假如我们给 \([1,a_1],[a_1+1,a_2] \cdots [a_{n-1}+1,a_n]\) 这些段编上编号:\(1,2,\cdots,k\),就会发现,这些段在最后的顺序只和 \(k\) 的奇偶性相关,即偶数的时候先倒序输出偶数编号的段再顺序输出奇数段,反之先倒叙输出奇数段,再正序输出偶数段。
CI MXX(5e5+1);
int n,k,q[MXX],cnt1,cnt2;
pair<int,int> co1[MXX],co2[MXX];
char s[MXX];
S main()
{
Files();
fr(n),fr(k);
scanf("%s",s+1);
int lst(1);
for(int i(1);i<=k;++i)
{
fr(q[i]);
if(i&1)
co1[++cnt1]=mkp(lst,q[i]);
else
co2[++cnt2]=mkp(lst,q[i]);
lst=q[i]+1;
}
if(k&1)
{
for(int i(cnt1);i;--i)
for(int j(co1[i].second);j>=co1[i].first;--j)
putchar(s[j]);
for(int i(1);i<=cnt2;++i)
for(int j(co2[i].first);j<=co2[i].second;++j)
putchar(s[j]);
}
else
{
for(int i(cnt2);i;--i)
for(int j(co2[i].second);j>=co2[i].first;--j)
putchar(s[j]);
for(int i(1);i<=cnt1;++i)
for(int j(co1[i].first);j<=co1[i].second;++j)
putchar(s[j]);
}
for(int i(lst);i<=n;++i)
putchar(s[i]);
Heriko Deltana;
}
「C」
分讨,先把奇数的情况全加上一个 \(1\),再把 \(20\) 的情况转化为其他数组合的方案,于是就只剩下了 \(1,2,5,10\) 需要考虑。
然后考虑如何把 \(10\) 转化为其他的数字。考虑模 \(10\) 的余数,发现除了余 \(1,3,6,8\) 的时候都能有唯一的方案,然后这四种之间通过加减 \(2\) 可以最后转化为两类,然后就看要多少的 \(5,2,2,2\) 和 \(5,1.\)
没写代码,爬。
「D」
好像设涉及泰勒展开和多项式求和,这比我技能树高的不知道到哪去了(