ARC 058

时间:2023-03-10 06:39:54
ARC 058

所以为啥要写来着...........

链接

T1

直接枚举大于等于$n$的所有数,暴力分解判断即可

复杂度$O(10n \log n)$

#include <cstdio>
#include <iostream>
using namespace std; #define sid 15
#define ri register int
int n, k, D[sid]; int main() {
int x, flag;
cin >> n >> k;
for(ri i = ; i <= k; i ++) { cin >> x; D[x] = ; } for(ri i = n; i; i ++) {
x = i; flag = ;
while(x) {
if(D[x % ]) { flag = ; break; }
x /= ;
}
if(!flag)
{ printf("%d\n", i); break; }
}
return ;
}

T2

把第$B$列单独拿出来讨论转移即可

复杂度$O(H)$

#include <cstdio>
#include <iostream>
using namespace std; #define sid 200050
#define ri register int
#define mod 1000000007 int fac[sid], inv[sid];
int H, W, A, B; void Init_C() {
fac[] = fac[] = ; inv[] = inv[] = ;
for(ri i = ; i <= ; i ++) fac[i] = 1ll * fac[i - ] * i % mod;
for(ri i = ; i <= ; i ++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
for(ri i = ; i <= ; i ++) inv[i] = 1ll * inv[i - ] * inv[i] % mod;
} int C(int n, int m) {
if(m > n) return ;
return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
} int way(int x1, int y1, int x2, int y2) {
return C(x2 - x1 + y2 - y1, x2 - x1);
} int main() {
Init_C();
cin >> H >> W >> A >> B;
int ans = , sum = ;
for(ri i = ; i <= H - A; i ++)
ans = (ans + 1ll * way(, , B, i) * way(B + , i, W, H) % mod) % mod;
printf("%d\n", ans);
return ;
}

T3

神奇状压.......

一开始没怎么想直接打了错误的$dp$....没过样例才意识到什么

正着计数不好计数,考虑反面,求解不存在连续区间和为$X, Y, Z$的数量

把$X, Y, Z$状压成为一种状态,当在末尾插入数字时,直接把状态前移,前面的数字会自动前移.....

然后暴力转移即可,复杂度$O(2^{17} * 40)$

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; #define ri register int
#define mod 1000000007 int bit[];
int N, x, y, z;
int f[][]; int main() {
cin >> N >> x >> y >> z;
for(ri i = ; i <= ; i ++) bit[i] = << i; int ans = ;
for(ri i = ; i <= N; i ++)
ans = 1ll * ans * % mod; f[][] = ;
int gg = bit[z - ] | bit[y + z - ] | bit[x + y + z - ];
int lim = bit[x + y + z] - ; for(ri i = ; i <= N; i ++)
for(ri S = ; S <= lim; S ++)
for(ri v = ; v <= ; v ++) {
int T = (S << v) | bit[v - ]; T &= lim;
if((T & gg) != gg) f[i][T] = (f[i][T] + f[i - ][S]) % mod;
} for(ri S = ; S <= lim; S ++)
if((S & gg) != gg) ans = (ans - f[N][S] + mod) % mod;
printf("%d\n", ans);
return ;
}

T4

留坑...

咕咕咕咕咕咕咕...