Divide by Zero 2021 and Codeforces Round 714 (Div. 2)(A~D)
创始人
2025-05-28 01:58:53
0

A. Array and Peaks

给出一个permutation,判断能不能随意排列数组,使得peak有恰好k个。peak是指该位置的数大于相邻两个数。

思路:由k的数量为限制,k必须小于等于(n - 1) / 2。然后将前k个数放到后面即可,例如1 2 3 4 5,可以放成这样:1 5 2 4 3。

AC Code:

#include typedef long long ll;
const int N = 2e5 + 5;
int t, n, k;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;while(t --) {std::cin >> n >> k;if(k > (n - 1) / 2) {std::cout << -1 << '\n';continue;}int num = 1;for(int i = n; i > k; i --) {if(num <= k)std::cout << num ++ << ' ';std::cout << i << ' ';}std::cout << '\n';}return 0;
}

B. AND Sequences

给出一个数组a,有多少种a的排列方式使得a数组满足上述条件。

思路:容易想到,第一个数二进制位为0的位置,后面的也必须有0,为1的地方后面必须全为1,最后一个数也是如此。所以显然,第一个数和最后一个数都是0最多的,且为1的位置其他的数也都是1,也就是两个数相等且为所有数的与和。我们可以设这个数的个数为k,则答案是

AC Code:

#include typedef long long ll;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int t, n;
int a[N], cnt[35];template
struct ModInt {const static int mod = T;int x;ModInt(int x = 0) : x(x % mod) {}ModInt(ll x) : x(int(x % mod)) {} int val() { return x; }ModInt operator + (const ModInt &a) const { int x0 = x + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }ModInt operator - (const ModInt &a) const { int x0 = x - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }ModInt operator * (const ModInt &a) const { return ModInt(1LL * x * a.x % mod); }ModInt operator / (const ModInt &a) const { return *this * a.inv(); }void operator += (const ModInt &a) { x += a.x; if (x >= mod) x -= mod; }void operator -= (const ModInt &a) { x -= a.x; if (x < 0) x += mod; }void operator *= (const ModInt &a) { x = 1LL * x * a.x % mod; }void operator /= (const ModInt &a) { *this = *this / a; }friend std::ostream &operator<<(std::ostream &os, const ModInt &a) { return os << a.x;}ModInt pow(int64_t n) const {ModInt res(1), mul(x);while(n){if (n & 1) res *= mul;mul *= mul;n >>= 1;}return res;}ModInt inv() const {int a = x, b = mod, u = 1, v = 0;while (b) {int t = a / b;a -= t * b; std::swap(a, b);u -= t * v; std::swap(u, v);}if (u < 0) u += mod;return u;}};
typedef ModInt mint;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;while(t --) {std::cin >> n;std::map mp;for(int i = 1; i <= n; i ++) {std::cin >> a[i];mp[a[i]] ++;}int num = a[1];for(int i = 1; i <= n; i ++) {num &= a[i];}ll cnt = mp[num];mint ans = 1;for(int i = 1; i <= n - 2; i ++) {ans *= i;}ans *= (cnt * (cnt - 1));std::cout << ans << '\n';}return 0;
}

C. Add One

给出一个数字n,进行m次操作,每次操作都对于n的每一位d用d+1替换,求m次操作后得到的数字长度是多少,答案对1e9+7取模。

思路:竟然是个dp问题。考虑令f[i]表示对10进行i次操作得到的数字长度为多少位,显然f[0~8] = 2,f[9] = 3,当i >= 10时,等于10时,是2110,分开来看,可以将21看做是对10操作了1次,10是对10操作了0次,这样得到递推式:f[i] = f[i - 9] + f[i - 10]。

AC Code:

#include typedef long long ll;
const int N = 2e5 + 5;
const int mod = 1e9 + 7;
int t, n, m;template
struct ModInt {const static int mod = T;int x;ModInt(int x = 0) : x(x % mod) {}ModInt(ll x) : x(int(x % mod)) {} int val() { return x; }ModInt operator + (const ModInt &a) const { int x0 = x + a.x; return ModInt(x0 < mod ? x0 : x0 - mod); }ModInt operator - (const ModInt &a) const { int x0 = x - a.x; return ModInt(x0 < 0 ? x0 + mod : x0); }ModInt operator * (const ModInt &a) const { return ModInt(1LL * x * a.x % mod); }ModInt operator / (const ModInt &a) const { return *this * a.inv(); }void operator += (const ModInt &a) { x += a.x; if (x >= mod) x -= mod; }void operator -= (const ModInt &a) { x -= a.x; if (x < 0) x += mod; }void operator *= (const ModInt &a) { x = 1LL * x * a.x % mod; }void operator /= (const ModInt &a) { *this = *this / a; }friend std::ostream &operator<<(std::ostream &os, const ModInt &a) { return os << a.x;}ModInt pow(int64_t n) const {ModInt res(1), mul(x);while(n){if (n & 1) res *= mul;mul *= mul;n >>= 1;}return res;}ModInt inv() const {int a = x, b = mod, u = 1, v = 0;while (b) {int t = a / b;a -= t * b; std::swap(a, b);u -= t * v; std::swap(u, v);}if (u < 0) u += mod;return u;}};
typedef ModInt mint;
mint f[N];int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;for(int i = 0; i <= 8; i ++) {f[i] = 2;}f[9] = 3;for(int i = 10; i <= 200005; i ++) {f[i] = f[i - 9] + f[i - 10];}while(t --) {std::cin >> n >> m;mint ans = 0;while(n) {int num = n % 10;if(num + m < 10)ans += 1;elseans += f[num + m - 10];n /= 10;}std::cout << ans << '\n';}return 0;
}

D. GCD and MST

给出一个具有n个点的无向图和一个长为n的数组a,如果a[i] ~a[j]之前所有的数的gcd等于这之间的最小值,则i和j点之间有一条长为这个最小值的边;若i与j的差值为1,则两点之间有一条长为p的边,求这张图上的最小生成树。

思路:一个假的图论题。首先发现,其实长度为p的边已经在图中生成了一棵生成树,但不一定是最小的,所以要尽可能用第一种方式替换长度为p的边。所以可以结构体存一下每个点的值和原位置,按照大小排序,从小到大遍历,每次采用双指针向两边扩展,得到一个尽可能大的范围,在答案中减去减少的值。

AC Code:

#include typedef long long ll;
const int N = 2e5 + 5;
ll t, n, p;
ll a[N];
bool vis[N];struct node {ll num;int pos;bool operator < (const node &a) const {return num < a.num; }
} e[N];int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);std::cin >> t;while(t --) {std::cin >> n >> p;for(int i = 1; i <= n; i ++) {vis[i] = false;std::cin >> a[i];e[i] = {a[i], i};}std::sort(e + 1, e + 1 + n);ll ans = (n - 1) * p;for(int i = 1; i <= n; i ++) {if(e[i].num >= p) break;if(vis[e[i].pos]) continue;int l = e[i].pos, r = l;vis[l] = true;while(l > 1 && !vis[l - 1] && a[l - 1] % e[i].num == 0) vis[l --] = true;while(r < n && !vis[r + 1] && a[r + 1] % e[i].num == 0) vis[r ++] = true;ans -= (r - l) * (p - e[i].num);}std::cout << ans << '\n';}return 0;
}

os:看到题解额时候就觉得2000分的题其实也还好(逃

相关内容

热门资讯

很简单个性签名 很简单个性签名大全  随着社交网络和信息技术的迅猛发展,越来越多人喜欢设置个性签名,使用个性签名可以...
最伤感的网名 最伤感的网名  网名指在网上使用的名字。由于网络是一个虚拟的世界,为了避免使用真实姓名带来的麻烦所以...
个性签名伤感 个性签名伤感  感谢你给我的所有伤害,是它们让我真正走向了成熟,个性签名伤感。下面是小编为大家分享的...
唯美的座右铭 唯美的座右铭唯美的座右铭1  1、伟大的心象海洋一样,永远不会封冻。  2、一般青年都是异常真挚、异...
微信励志网名 微信励志网名  微信励志网名(精选265个)  名字的意义在于它可以用来代表一个人,区别于别的人,名...
qq群个性签名 qq群个性签名27句  1、以前美女玩非主流 现在肥猪开始横行了,这都怎么了。  2、比较1下这两条...
简洁的个人伤感签名 简洁的个人伤感签名汇总99条  各种烦躁各种累各种难受各种泪。下面是小编整理的个人伤感签名99条,感...
如何用qq制作个性化动态论坛... 如何用qq制作个性化动态论坛签名  第一步:登录QQ,然后依次点击“开始/个人设置”菜单,打开QQ2...
王者荣耀情侣网名大全 王者荣耀情侣网名大全  王者荣耀情侣网名大全(精选220个)  名字的意义在于它可以用来代表一个人,...
独一无二的霸气个性签名 独一无二的霸气个性签名(精选150句)  随着移动互联网和社交网络的飞速发展,越来越多人喜欢在网上设...
高档大气微信名 高档大气微信名  微信现如今已经成为了我们日常生活的一部分,如果说微信头像是一个人的门面,那么微信名...
幼儿园我的教育故事 爱是真正的老师偶然间,看到一篇文章,题目是《爱是最好的老师》,感觉不错,文章是这样的:“许多年前,有...
抖音网名大全 抖音网名大全  抖音网名大全(精选270个)  名字的意义在于它可以用来代表一个人,区别于别的人,名...
表示后悔的个性签名 表示后悔的个性签名  给我时间,我要努力成为你未来见到会后悔没好好珍惜的人。以下是小编整理的表示后悔...
漾濞石门关 漾濞石门关漾濞石门关漾濞石门关(漾濞石门关)在大理苍山背后的江边,有两座高数百米的断崖峡谷,形如两扇...
猴子捞月亮英文故事   猴子捞月亮的故事十分适合我们儿童睡前听的故事,unjs小编今天就为大家带来猴子捞月亮英文故事,欢...
高士其科普童话 高士其科普童话  高士其原名高仕錤,福州人,生物学家,化学家,著名科普作家。也是《高士其科普童话》一...
关于雷锋无私奉献的小故事大全   雷锋——这个名字在中国人耳中并不陌生,他助人为乐的事迹在中国广为流传,“雷锋出差一千里,好事做了...
晚上哄孩子睡觉的童话小故事 晚上哄孩子睡觉的童话小故事8篇晚上哄孩子睡觉的童话小故事1  小白兔非常喜欢吃胡萝卜,每天小白兔在睡...
童话故事《小红帽》 童话故事《小红帽》  小红帽是德国童话作家格林的童话《小红帽》中的人物。“小红帽”的故事版本多达一百...