A. 谜之阶乘

题目是让我们把 \(n\) 分解成两个阶乘的商,本来想推个式子什么的,结果发现推不出来。

我们知道,阶乘的增长速率非常的快啊!那么这个 \(b - a\) 的值肯定不会太大,我们可以暴力枚举 \(b - a\) 的值。

假设我们选择 \(5\) 个连续的正整数的乘积为 \(n\),那么他们的值都在 \(\sqrt[5]{n}\) 附近。

那么假设 \(d = b - a\),显然有 \(\displaystyle a < \sqrt[d]{n}\),\(\displaystyle b < \sqrt[d]{n}\)。

我们就可以直接在 \(\sqrt[d]{n}\) 附近的范围枚举,枚举 \(20\) 个就差不多了。

复杂度大概是 \(\displaystyle O(T \ \text{log}_2^2 \ n)\)。

Code:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define int long long int T;
int n; struct Node{
int first,second; friend bool operator<(Node a,Node b) {
return a.first < b.first;
}
}res[100500]; int cnt; signed main() {
std::cin >> T;
while(T--) {
std::cin >> n;
if(n == 1) {
std::cout << "-1\n";
continue;
}
cnt = 1;
res[cnt] = (Node){n,n - 1};
for(int i = 2;i <= 63; i++) {
int x = pow((double)n,(double)1 / (double)i);
while(1) {
int y = x - i + 1;
int k = 1;
for(int i = y;i <= x; i++)
k *= i; if(k > n)
break; if(k == n && y - 1 != 0) {
cnt ++;
res[cnt] = (Node){x,y - 1};
break;
}
x ++;
}
} std::cout << cnt << "\n";
for(int i = cnt;i >= 1; i--)
std::cout << res[i].first << " " << res[i].second << "\n";
}
return 0;
}

B. 子集

记 \(m = \dfrac{n}{k}\)。

首先判掉无解的情况。

\(m = 1\) 时显然是无解的。

若 \(1\) 到 \(n\) 之和不是 \(k\) 的倍数,肯定无法分成相等的集合,也无解。

若 \(n\) 为偶数而 \(m\) 是奇数,也就符合了上面说的那种情况,无解。

再特判一下 \(k = 1\) 的情况,直接输出就可以了。

考虑 \(m\) 为偶数,那么我们可以直接将 \(i\) 与 \(n - i\) 配对,显然这样各集合元素之和是相等的。

若 \(n,m\) 均为奇数,我们把 \(m\) 看作 \(2x + 3\),对于 \(2x\) 我们像之前那样处理,只是特殊处理出前三列。

然后进行构造。



复杂度 \(O(n)\)。

Code:

#include <bits/stdc++.h>

using namespace std;

#define int long long

int T,n,k,m;

long long sum,cnt;

int l;

std::vector<int> f[500500];

signed main() {
    cin >> T;
    while(T--) {
        for(int i = 0;i < 500500; i++)
            f[i].clear();
        cin >> n >> k;
        m = n / k;
        sum = n * (n + 1) / 2;         if(k == 1) {
            printf("Yes\n");
            for(int i = 1;i <= n; i++)
                cout << i << " ";
            cout << endl;
            continue;
        }         if(sum%k != 0 || m == 1 || n == k) {
            // 有 n 组,不可能各组和相等  
            cout << "No" << endl;
            continue;
        }         if(n&1 == 0 && m&1 != 0) {
            // 1 到 n 的和肯定不是 k 的倍数  
            cout << "No" << endl;
            continue;
        }         cout << "Yes\n";
        if(m&1) {// m 为奇数  
            for(int i = 1;i <= (m - 3)/2; i++) {
                l = (i - 1) * 2 * k;
                for(int j = 1;j <= k; j++)
                    f[j].push_back(l + j);                 for(int j = k;j >= 1; j--)
                    f[j].push_back(l + 2 * k - j + 1);
            }             l = (m - 3) * k;             for(int i = 1;i <= k; i++)
                f[i].push_back(l + i);             l = l + k;             for(int i = (k - 1)/2 + 1; i <= k; i++)
                f[i].push_back(l + i - (k - 1)/2);             for(int i = 1;i <= (k - 1)/2; i++)
                f[i].push_back(l + k - (k - 1)/2 + i);             for(int i = (k - 1)/2 + 1,m = n;i <= k; i++, m -= 2)
                f[i].push_back(m);             for(int i = 1,m = n - 1;i <= (k - 1)/2; i ++ ,m -= 2)
                f[i].push_back(m);             for(int i = 1;i <= k; i++) {
                for(int j = 0;j < f[i].size(); j++)
                    cout << f[i][j] << " ";
                cout << endl;
            }
        }
        else {
            for(int i = 1;i <= k; i++) {
                for(int j = 1;j <= (m/2); j++) {
                    int l = 2 * (j - 1);
                    cout << (l * k + i) << " " << ((l | 1)*k + k - i + 1) << " ";
                }
                cout << endl;
            }
        }
}
    return 0;
}
/*
Input:
4
4 4
4 1
12 3
9 3
*/

C. 混凝土粉末

把询问离线,在序列下标上执行扫描线,开一棵以询问编号为下标的树状数组。

扫到一个修改的左端点时,在树状数组上二分,扫到左端点加 \(h[i]\),扫到右端点时减去。

扫到询问时,在树状数组上二分。

Code:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#define int long long using namespace std; const int N = 2005000; int n,q;
int opt[N],res[N]; vector< pair<int,int> > g[N],h[N]; class BIT{
private:
int bit[N]; int lowbit(int x) {
return x & (-x);
}
public:
void Add(int x,int y,int val) {
for(int i = x;i <= y; i += lowbit(i))
bit[i] += val;
} int Query(int x) {
int ans = 0; for(int i = x;i; i -= lowbit(i))
ans += bit[i]; return ans;
}
}tree; signed main() {
cin >> n >> q;
for(int i = 1,l,r,x,y;i <= q; i++) {
cin >> opt[i];
if(opt[i] == 1) {
cin >> l >> r >> x;
g[l].push_back(make_pair(i,x));
g[r + 1].push_back(make_pair(i,-x));
}
else {
cin >> x >> y;
h[x].push_back(make_pair(i,y));
}
} for(int i = 1;i <= n; i++) {
for(int j = 0;j < g[i].size(); j++)
tree.Add(g[i][j].first,q,g[i][j].second); for(int j = 0;j < h[i].size(); j++) {
int l = 1,r = h[i][j].first,mid; while(l < r) {
mid = (l + r) >> 1;
if(tree.Query(mid) >= h[i][j].second)
res[h[i][j].first] = r = mid;
else
l = mid + 1;
}
}
} for(int i = 1;i <= q; i++)
if(opt[i] == 2)
cout << res[i] << endl;
return 0;
}

D. 排水系统





Code:

#include <bits/stdc++.h>

#define int long long

const int N = 20090500;
const int MOD = 998244353; int n,m,r,k; struct Edge{
int next,to,val;
}e[N]; int h[N],cnt; int in[N],out[N],sum; int inv[N],inverse; int f[N][2]; std::queue<int> que; void Add(int u,int v,int w) {
cnt ++;
e[cnt].next = h[u];
h[u] = cnt;
e[cnt].to = v;
e[cnt].val = w;
return ;
} int pow(int a,int b) {
int ans = 1;
while(b) {
if(b&1)
ans *= a;
ans %= MOD;
a *= a;
a %= MOD;
b >>= 1;
}
return ans;
} void Input() {
std::cin >> n >> m >> r >> k; for(int i = 1,u,v,w;i <= k; i++) {
std::cin >> u >> v >> w;
Add(u,v,w); in[v] ++;
out[u] ++; sum += w;
sum %= MOD;
}
return ;
} void Ready() { inverse = pow(sum,MOD - 2);
std::cerr << inverse <<"\n";
inv[1] = 1;
for(int i = 2;i <= k; i++)
inv[i] = (long long)(MOD - MOD / i) * inv[MOD % i] % MOD; for(int i = 1;i <= n; i++)
if(!in[i])
que.push(i); for(int i = 1;i <= m; i++)
f[i][0] = f[i][1] = 1;
return ;
} void Work() {
while(!que.empty()) {
int x = que.front();
que.pop();
int tot = 0; for(int i = h[x];i; i = e[i].next) {
int to = e[i].to;
in[to] --; if(!in[to])
que.push(to); f[to][1] = (f[to][1] + (long long)f[x][1] % MOD * inv[out[x]] % MOD) % MOD;
f[to][0] = (f[to][0] + (long long)f[x][0] % MOD * inv[out[x]] % MOD) % MOD; tot = (tot + (long long)f[x][0] % MOD * inverse % MOD * e[i].val % MOD * inv[out[x] - 1] % MOD * inv[out[x]]) % MOD;
} for(int i = h[x];i; i = e[i].next) {
int to = e[i].to; f[to][1] = (f[to][1] + tot - (long long)f[x][0] % MOD * inverse % MOD * e[i].val % MOD * inv[out[x] - 1] % MOD * inv[out[x]] % MOD + MOD) % MOD;
f[to][1] = (f[to][1] + MOD - (long long)f[x][0] % MOD * inverse % MOD * e[i].val % MOD * inv[out[x]] % MOD) % MOD;
}
} return ;
} void Output() {
for(int i = n - r + 1;i <= n; i++)
std::cout << (f[i][1] + MOD) % MOD << " ";
return ;
} signed main() {
Input(); Ready(); Work(); Output();
return 0;
}

NOIP模拟测试A3的更多相关文章

  1. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  5. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  6. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  7. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  8. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  9. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  10. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

随机推荐

  1. Django框架——静态文件配置、form表单、request对象、连接数据库、ORM简介、ORM基本操作和语句

    配置文件介绍 SECRET_KEY = '0yge9t5m9&%=of**qk2m9z^7-gp2db)g!*5dzb136ys0#)*%*a' # 盐 DEBUG = True # 调试模式 ...

  2. 明解STM32—GPIO应用设计篇之API函数及配置使用技巧

    一.前言 本篇开始对STM32的GPIO在实际开发设计中的使用配置和技巧进行探讨,可以先去回顾下之前介绍的GPIO的相关理论基础知识包括基本结构,工作模式和寄存器原理. 了解过STM32的GPIO相关 ...

  3. pinia的使用

    1. pinia和vuex的区别 pinia没有mutations,只有:state. getters. actions pinia分模块不需要modules(之前vuex分模块需要modules) ...

  4. Python LOG-日志

    LOG https://www.cnblogs.com/yyds/p/6901864.html logging logging模块提供模块级别的函数记录日志 包括四大组件 1. 日志相关概念 日志 日 ...

  5. Python 使用列表一部分(切片)

    使用列表的一部分(切片) 处理列表的部分元素 切片 指定第一个元素的索引和最后一个元素索引加1 列表名[索引:索引+1] 索引加1:列表中第索引个元素 (左包括右不包括) 未指定索引 列表名[:] 提 ...

  6. KMP字符串匹配问题

    KMP算法 本文参考资料:https://www.zhihu.com/question/21923021 KMP算法是一种字符串匹配算法,可以在 \(O(n+m)\) 的时间复杂度内实现两个字符串的匹 ...

  7. Java的抽象类 & 接口

    抽象类 如果自下而上在类的继承层次结构中上移,位于上层的类更具有通用性,甚至可能更加抽象.从某种角度看,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为想使用的特定的实例类.例如,考虑一下对 ...

  8. SpringBoot定义优雅全局统一Restful API 响应框架四

    如果没有看前面几篇文章请先看前面几篇 SpringBoot定义优雅全局统一Restful API 响应框架 SpringBoot定义优雅全局统一Restful API 响应框架二 SpringBoot ...

  9. 文心一言 VS chatgpt (8)-- 算法导论2.3 5~6题

    五.回顾查找问题(参见练习 2.1-3),注意到,如果序列 A 已排好序,就可以将该序列的中点与v进行比较.根据比较的结果,原序列中有一半就可以不用再做进一步的考虑了.二分查找算法重复这个过程,每次都 ...

  10. 2022-03-25:给定一个长度为 N 的字符串 S,由字符‘a‘和‘b‘组成,空隙由 ‘?‘ 表示。 你的任务是用a字符或b字符替换每个间隙, 替换完成后想让连续出现同一种字符的最长子串尽可能短。

    2022-03-25:给定一个长度为 N 的字符串 S,由字符'a'和'b'组成,空隙由 '?' 表示. 你的任务是用a字符或b字符替换每个间隙, 替换完成后想让连续出现同一种字符的最长子串尽可能短. ...