「THP3考前信心赛」解题报告
写在前面&总结:
\(LuckyBlock\) 良心出题人!暴力分给了 \(120pts\)
\(T1\) 貌似是个结论题,最后知道怎么算了,用前缀和搞了两下,写挂了就很草,最后只能靠暴力拿了 \(30pts\)
\(T2\) 显然数论题,但是我不会化简/kk,不过用前缀和优化了一下暴力 \(40pts\);
\(T3\) 依旧暴力,\(O(n^2)\) 可拿 \(40pts\)
\(T4\) 部分分 \(5pts\) \(+\) \(lps\) 随机输出 \('7'\) \(5pts\);
不会打暴力的 \(OIer\) 不是好 \(OIer\) ,不打暴力的都是**(没错说的就是CSP2020上的我
感觉 \(LuckyBlock\) 这次考察的芝士点比较详细,先粘个题解网址咕着,以后再补
T1
改自 CF1422C
发现可以当做取出一段序列,把剩下的拼接起来
在拼接过程中发现有许多部分是重复计算的,可以用后缀和和开个 \(10^i\) 的数组预处理
算了我也说不清楚直接放代码吧嘻嘻
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int MAXN = 2e6+6;
const int INF = 1;
const int mod = 1e9+7;
LL hsum[MAXN], jc[MAXN];
char ch[MAXN];
LL ans;
int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0' , ch = getchar();
return s * w;
}
LL quick(LL x, LL p, LL mod){
LL res = 1;
for( ; p; p >>= 1){
if(p & 1) res = res * x % mod;
x = x * x % mod;
}
return res;
}
signed main()
{
cin>>ch;
LL len = strlen(ch);
int cnt = 0;
cnt = 1; jc[0] = 1;
for(int i = 1; i <= len; ++i){
jc[i] = jc[i - 1] * 10 % mod;
}
cnt = 0;
for(int i = len - 1; i >= 0; --i){//求后缀数
cnt = (cnt + (ch[i] - '0') * jc[len - 1 - i] % mod) % mod;
hsum[i] = cnt;
// cout<<hsum[i]<<' ';
}
LL val = 0, sum = 0;
for(int i = 0; i < len; ++i){
ans += sum * jc[len - 1 - i] % mod;
ans += i * hsum[i] % mod;
ans %= mod;
val = (10 * val % mod + ch[i] - '0') % mod;
sum = (sum + val) % mod;
}
printf("%lld", ans % mod);
return 0;
}
暴力部分核心代码:
for(int l = 0; l < len; ++l){
LL cnt = 0;
for(int r = l; r < len; ++r){
for(int i = 0; i < len; ++i){
if(i < l || i > r){
cnt = (cnt * 10 % mod + ch[i] - '0') % mod;
}
}
ans = (ans + cnt) % mod;
}
}
T2
\(40pts\) 暴力:
求 \(gcd(i, n)\) 是有多次求的,可以用前缀和预处理 \(2000\) 个点然后 \(O(n)\) 出结果
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1e6+6;;
const int INF = 1;
const int mod = 998244353;
int T, l, r;
int gcd[2010][2010];
int sum[2020];
int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0' , ch = getchar();
return s * w;
}
int Gcd(int x, int y){
return x % y == 0 ? y : Gcd(y, x % y);
}
void init(){
for(int i = 1; i <= 2000; ++i){
for(int j = 1; j <= i; ++j){
// a[i][j] = Gcd(j, i);
sum[i] = (sum[i] + Gcd(j, i)) % mod ;
}
}
}
int main()
{
init();
T = read();
while(T--){
l = read(), r = read();
int ans = 0;
for(int i = l; i <= r; ++i){
ans = (ans + sum[i]) % mod;
}
printf("%d\n", ans);
}
return 0;
}
\(100pts\) 正解
考虑化一下 \(f\) 。
\]
考虑对于每一个 \(1 \sim n\) 的值,能作为多少数对的 \(gcd\) ,于是有:
\]
发现 \(gcd(i, n) = d\) 的必要条件是 \(d \mid n\) ,原式可以改为:
\]
考虑什么样的 \(i\) ,满足 \(\gcd(i, n) = d\) ,显然当且仅当 \(i = kd(k \in \mathbb{N^*})\) ,且 \(\gcd(k, \frac{n}{d}) = 1\) 是满足条件。为保证 \(i \le n\) ,有 \(k \le \left\lfloor\frac{n}{d}\right\rfloor\) 。
于是考虑把 \(d\) 提出来,改为枚举上述的 \(k\) ,原式等于:
\]
考虑后面一个 \(\sum\) 的实际意义,表示 \(1 \sim \frac{n}{d}\) 中与 \(\frac{n}{d}\) 互质的个数,符合欧拉函数的定义,于是原式等于:
\]
线性筛预处理 \(\varphi\) 后,有埃氏筛即可筛出 \(1 \sim 10^{6}\) 的所有的 \(f\) 。
做个前缀和即可回答区间询问
复杂度 \(O(n\ \log \ n + m)\)
(Solution来自LuckyBlock的题解)
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1e6+5;
const int kMax = 1e6;
const int INF = 1;
const int mod = 998244353;
int p_cnt, p[MAXN], phi[MAXN];
int f[MAXN], sum[MAXN];
bool vis[MAXN];
int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0' , ch = getchar();
return s * w;
}
void init(){
phi[1] = 1;
for(int i = 2; i <= kMax; ++i){
if(!vis[i]){
p[++p_cnt] = i;
phi[i] = i - 1;
}
for(int j = 1; j <= p_cnt && i * p[j] <= kMax; ++j){
vis[i * p[j]] = true;
if(i % p[j] == 0){
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * (p[j] - 1);
}
}
for(int i = 1; i <= kMax; ++i){
for(int j = i; j <= kMax; j += i){
f[j] = (f[j] + 1ll * phi[i] * (j / i) % mod) % mod;
}
}
for(int i = 1; i <= kMax; ++i){
sum[i] = (sum[i - 1] + f[i]) % mod;
}
}
int main()
{
init();
int m = read();
while(m--){
int l = read(), r = read();
printf("%d\n", (sum[r] - sum[l - 1] + mod) % mod);
}
}
T3
\(40pts\) 暴力:
暴力更改区间起点暴力求所有情况的最大值即可
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1;
const int INF = 1;
const int mod = 1;
int n;
char a[50100], b[50010];
int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0' , ch = getchar();
return s * w;
}
int main()
{
n = read();
cin>>a>>b;
int ans = -1;
for(int i = 0; i < n; ++i){
int cnt = 0;
for(int j = 0; j < n; ++j){
int x = i + j;
x = (x >= n ? x - n : x);
if(a[j] == '1' && b[x] == '1'){
cnt++;
}
}
ans = max(ans, cnt);
}
printf("%d", ans);
return 0;
}
\(100pts\) 正解:
利用 bitset
容器,详细介绍请看 Oi-Wiki
/*
Work by: Suzt_ilymics
Knowledge: ??
Time: O(??)
*/
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<bitset>
using namespace std;
const int MAXN = 1e5+10;
const int INF = 1;
const int mod = 1;
int n, ans;
char s1[MAXN], s2[MAXN];
bitset <MAXN> a, b, c;
int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + ch - '0' , ch = getchar();
return s * w;
}
void max(int &x, int y){if(x < y) x = y; }
int main()
{
n = read();
scanf("%s", s1 + 1);
scanf("%s", s2 + 1);
for(int i = 1; i <= n; ++i){
a[i] = (s1[i] == '1');
b[i] = (s2[i] == '1');
}
for(int i = 1; i <= n; ++i){
b[n + 1] = b[1];
b >>= 1;
max(ans, (a & b).count());
}
printf("%d", ans);
return 0;
}
T4
改自 CF1422C
只拿了部分分就不粘码了嘻嘻
「THP3考前信心赛」解题报告的更多相关文章
- 「THP3考前信心赛」题解
目录 写在前面 A 未来宇宙 B 空海澄澈 C 旧约酒馆 算法一 算法二 D 博物之志 算法一 算法二 算法三 写在前面 比赛地址:THP3 考前信心赛. 感谢原出题人的贡献:第一题 CF1422C, ...
- 「ZJOI2016」解题报告
「ZJOI2016」解题报告 我大浙的省选题真是超级神仙--这套已经算是比较可做的了. 「ZJOI2016」旅行者 神仙分治题. 对于一个矩形,每次我们从最长边切开,最短边不会超过 \(\sqrt{n ...
- #10471. 「2020-10-02 提高模拟赛」灌溉 (water)
题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...
- #10470. 「2020-10-02 提高模拟赛」流水线 (line)
题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...
- nowcoder(牛客网)OI测试赛2 解题报告
qwq听说是一场普及组难度的比赛,所以我就兴高采烈地过来了qwq 然后发现题目确实不难qwq.....但是因为蒟蒻我太蒻了,考的还是很差啦qwq orz那些AK的dalao们qwq 赛后闲来无事,弄一 ...
- 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱
题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱
题1 素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...
随机推荐
- pandas取前K大的数,sort_values()和nlargest()速度比较
排序量比较大时: 数据量比较小时: 所以结论就是: 数据量大时选用nlargest,数据量小时选用sort_values() 具体数据量怎么算大:10000条时两个方法的时间差不多,所以可以按1000 ...
- esp-01与esp-01s的区别 ESP8288-01S与ESP8288-01的区别
ESP8266系列Wi-Fi模块一共有01-14十多款模块, ESP8266-01简称ESP-01, ESP8266-01S简称ESP-01S 至于他们的区别请看下图:左边的是ESP8266-01S, ...
- JavaSwing 船只停靠管理可视化(一)
最近抽空闲时间做了船只停靠管理系统,先看一下效果. 停靠泊位管理:实现泊位的 增删改查. JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing ...
- Python 字符串操作分类
应用举例: str="abc defghi jklm nopqrstuvwxyz" print(str.isspace()) 运行结果: False 1) 判断类型 方法 | 说明 ...
- MongoDb二
获取集合的时候,可以传入bean的class文件.来实现数据的绑定.在这之前.需要自定义一个Codec类.进行数据的转换. MongoClient client=new MongoClient(new ...
- 阿里云centos7安装mysql8数据库
一.安装mysql 1. mysql官网查找仓库源镜像,选择downloads https://www.mysql.com/downloads/ 2. 找到社区版 3. 选择yum仓库 4. 选择对应 ...
- Java基础--接口回调(接口 对象名 = new 类名)理解
接口 对象名1 = new 类名和类名 对象名2 = new 类名的区别是什么? 实例 /** *Person.java 接口 */ public interface Person { void in ...
- (数据科学学习手札102)Python+Dash快速web应用开发——基础概念篇
本文示例代码与数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的新系列教程Python+Dash快 ...
- k8s之RBAC授权模式
导读 上一篇说了k8s的授权管理,这一篇就来详细看一下RBAC授权模式的使用 RBAC授权模式 基于角色的访问控制,启用此模式,需要在API Server的启动参数上添加如下配置,(k8s默然采用此授 ...
- 剑指offer-56数组中数字出现的次数
题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 输入:nums = [4,1,4,6] 输出 ...