iinattr

澡堂邮寄 day3-3

2022-07-24

5.3日以考试为主

T1签

小 D 对细胞分裂很感兴趣,现在小 D 发现了一种魔法细胞,一个魔法细胞在第二天会分裂出 x−1 个新的细胞(同时原细胞依然存在)。

初始容器中有 0 个魔法细胞,现在小 D 会在第 i 天往容器中加入 i 个魔法细胞,现在小 D 想知道,在第 n 天,培养皿中会有多少个细胞。

你只需要输出答案 modp 后的结果即可。
易得递推式 $T_n=xT_n-1+n$
错误做法:易得其封闭形式 因为人间之屑出题人模数非质 无法计算
正确做法:矩阵快速幂
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define maxn 10
using namespace std;
int n,mo,x;
struct ahaha{
ll a[maxn][maxn];
ahaha(){
memset(a,0,sizeof a);
}
}a;
ahaha operator *(const ahaha &x,const ahaha &y){
ahaha z;
for(int k=1;k<=3;++k)
for(int i=1;i<=3;++i)
for(int j=1;j<=3;++j)
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;
return z;
}
int main(){
cin >> n >> x >> mo;
ahaha ans;
ans.a[1][1] = 0;
ans.a[1][2] = 0;
ans.a[1][3] = 1;
a.a[1][1] = x;
a.a[2][1] = 1;
a.a[3][1] = 1;
a.a[2][2] = 1;
a.a[3][2] = 1;
a.a[3][3] = 1;
do{
if(n&1)ans=ans*a;
a=a*a;n>>=1;
}while(n);
cout << ans.a[1][1];
return 0;
}

T2到


傻逼题 直接数位dp(然鹅我更傻逼 考场写不出来)

T3题


正解不会qwq
但其实是个结论题

迭代加深搜索即可qwq