20220912--CSP-S模拟4

news/2024/5/15 10:07:41/文章来源:https://www.cnblogs.com/WintersRain/p/16686277.html

A. 石子游戏

首先了解一个叫做 \(\operatorname{Nim}\) 游戏的玩意
通常的 \(\operatorname{Nim}\) 游戏的定义是这样的:
有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”
如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)
那么有一个美妙的结论:如果石子数的异或和为 \(0\) 则后手必胜,否则先手必胜
证明:如果石子数的异或和为 \(0\) ,也即 \(a_1\oplus a_2 \oplus \cdots \oplus a_n=0\)
那么改变一个数字 \(a_i\) 使原式异或和不为 \(0\) ,设改变后的二进制表示为 \(\Delta_2\)
那么一定存在某个 \(a_j\)\(\Delta_2\) 的最高位上是 \(1\)(否则无法得到这个 \(1\)
改变这个 \(a_j\) 即可
对于本题只要将所有 \(a_i\)\(x+1\) 求异或和是否为 \(0\)

image

关于数组 \(f\)
题解里面预处理的 \(f\) 数组是基于位运算的,\(f[i][j]\) 是由第 \(j+1\) 位加一个 \(1\)转移过来的,
然后这一段区间使用了状压的思想枚举了子集算出的和累加的贡献
把后面的式子拆开就可以发现,累加的次数刚好为 \([0,2^j−1]\)
这还表明了一个问题,就是只有偶数段才会做贡献。别着急问偶数段是啥,先听我说
刚才说累加的次数只有 \(2^j\) 次,而 \(2^{j+1}=2^j\times 2\)是累加次数的二倍
再看累加的起点终点,不难发现,如果把 \(2^j\) 长度称为一段,那么 \(2^{j+1}\) 就是两段,分开考虑这两段。
因为累加的起点在第二段开头也就是 \(i+2^j\) 而不是 \(i\)
所以每次加上一个 \(2^j+1\)长度的区间里面都只有第二段做出了累加的贡献,所以说只有偶数段才做贡献。
关于答案计算:
对于枚举每一个 \(x+1\) ,我们枚举一个 \(j\), 显然只会枚举到 \(\log_2(x)\)
然后我们再枚举一下可能的 \(k\) 找到一段要计算的区间 \([l,r]\) ,使用向下取整的方式找到距离 \(r\) 最近的 \(l+2^{j+1}\)
这一段的贡献可以用预处理出的数组直接做后缀和求出
然后考虑区间 \([l+2^{j+1},r]\) ,这段区间如果是在奇数区间,则不用计算单独的贡献,因为他没有
如果有一些在偶数区间或者被偶数区间包含,就需要使用前缀和求出贡献,很好求,直接最右端减去最左端就行
算出的这个数如果是奇数,就会有贡献,给计数器上的 \(j\) 位异或一个 \(1\)
因为要计算总和,现在枚举的是区间,需要找的是所有可能区间的答案的和是否为奇数
所以是异或,不是与,如果两个区间都是奇数那答案就会变成偶数。
这样就差不多了。

点击查看代码
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=501000,INF=1099588621776;
int n,cnt[WR<<1];
int dp[WR<<1][55];
int read(){int s=0,w=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}return s*w;
}
signed main(){freopen("stone.in","r",stdin);freopen("stone.out","w",stdout);n=read();for(int i=1;i<=n;i++) cnt[read()]++;for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];for(int i=n;i!=-1;i--)for(int j=0;j<=log2(n-i+1);j++)dp[i][j]=dp[min(i+(1<<(j+1)),n)][j]+cnt[min(i+(1<<(j+1))-1,n)]-cnt[i+(1<<j)-1];for(int y=2;y<=n+1;y++){int tmp=0;bool flag=0;for(int j=0;j<=log2(y-1);j++){for(int k=0;k*y<=n;k++){int l=k*y,r=min((k+1)*y-1,n),flr=(r-l+1)>>(j+1);bool lim=(l+flr*(1<<(j+1))+(1<<j)<=r);if((dp[l][j]-dp[l+flr*(1<<(j+1))][j]+lim*(cnt[r]-cnt[l+flr*(1<<(j+1))+(1<<j)-1]))&1) tmp^=1<<j;}if(tmp){flag=1;break;}}printf(flag?"Alice ":"Bob ");}fclose(stdin);fclose(stdout);return 0;
}

C. 黑客

首先如果你像我一样上来先一眼线性筛了 \(\mu\) 函数准备莫反那么恭喜你
你假了
咳,正经的做法非常显然
对于一组数据 \([a,b],[c,d]\)
针对每一个分数,设为 \(\frac{p}{q}\)
我们都可以找到 \(l_1,r_1,l_2,r_2\) 使得 \(l_1p>=a\; ,\; r_1p<=b\)\(l_2q>=c\; ,\; r_2q<=d\)
那么分数可以变成 \(\frac{\lambda p}{\mu q}\)\(\lambda \in [l_1,r_1]\; ,\; \mu\in [l_2,r_2]\)
显然地,当 \(\lambda=\mu\) 的时候可以约分,这样的 \((\lambda,\mu)\) 共有 \(\min(r_1,r_2)-\max(l_1,l_2)+1\)

点击查看代码
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=501000,INF=1099588621776,mod=1e9+7;
int a,b,c,d;
int ans;
int read(){int s=0,w=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}return s*w;
}
int gcd(int a,int b){if(!b) return a;return gcd(b,a%b);
}
signed main(){freopen("hacker.in","r",stdin);freopen("hacker.out","w",stdout);a=read(),b=read(),c=read(),d=read();for(int i=1;i<=998;i++){for(int j=1;j<=999-i;j++){if(gcd(i,j)!=1) continue;int l=max((int)ceil((double)a/i),(int)ceil((double)c/j));int r=min((int)floor((double)b/i),(int)floor((double)d/j));// printf("%lld %lld\n",l,r);if(r>=l) ans=(ans+(i+j)*(r-l+1)%mod)%mod;}}printf("%lld\n",ans);fclose(stdin);fclose(stdout);return 0;
}

D. 黑客(续)

无耻的高精度题
无耻的卡常题
不是这么做真的有任何必要吗???
考虑一个数位 \(\operatorname{DP}\)
设当前数字选择状态为 \(S\) ,当前递归到了第 \(pos\)
然后非常显然地就可以写出代码

这个只有90分
//RNM高精度!!!!!!退钱!!!!!!!
#include<cstdio>
#include<cstring>
#include<string>
#define int long long
#define WR WinterRain
using namespace std;
const int WR=510,INF=1099588621776,mod=1e17;
struct BigNum{int num[70],len;void clr(){memset(num,0,sizeof(num));len=0;}BigNum operator =(int val){clr();while(val){num[++len]=val%mod;val/=mod;}return *this;}BigNum operator +(const BigNum &b)const{BigNum res=*this;for(int i=1;i<=b.len;i++){res.num[i]+=b.num[i];res.num[i+1]+=res.num[i]/mod;res.num[i]%=mod;}while(res.num[++res.len]){res.num[res.len+1]+=res.num[res.len]/mod;res.num[res.len]%=mod;}while(res.len>1&&!res.num[res.len]) res.len--;return res;}BigNum operator +=(const BigNum &b){*this=*this+b;return *this;}BigNum operator *(const int &b)const{BigNum res=*this;for(int i=1;i<=res.len;i++) res.num[i]*=b;for(int i=1;i<=res.len;i++){res.num[i+1]+=res.num[i]/mod;res.num[i]%=mod;}while(res.num[++res.len]){res.num[res.len+1]+=res.num[res.len]/mod;res.num[res.len]%=mod;}while(res.len>1&&!res.num[res.len]) res.len--;return res;}BigNum operator *=(const int &b){*this=*this*b;return *this;}void print(){printf("%lld",num[len]);for(int i=len-1;i>=1;i--){if(!len) break;printf("%017lld",num[i]);}printf("\n");}
};
int n,m,k;
int ban[WR];
pair<BigNum,BigNum>dp[WR][(1<<9)+10];
int read(){int s=0,w=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-') w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}return s*w;
}
pair<BigNum,BigNum> dfs(int pos,int S){if(dp[pos][S].first.num[1]>=0) return dp[pos][S];if(pos>n){BigNum tmp1,tmp2;tmp1=1,tmp2=0;return dp[pos][S]=make_pair(tmp1,tmp2);}dp[pos][S].first=0;for(int i=1;i<=k;i++){if(!(S&ban[i])){pair<BigNum,BigNum>res=dfs(pos+1,S|(1<<(i-1)));dp[pos][S].first+=res.first;res.first=res.first*i,res.second=res.second*10;dp[pos][S].second=dp[pos][S].second+res.first+res.second;}}return dp[pos][S];
}
signed main(){freopen("hacker2.in","r",stdin);freopen("hacker2.out","w",stdout);n=read(),m=read(),k=read();int tmp=(1<<k);for(int i=1;i<=n+1;i++){for(int j=0;j<tmp;j++){dp[i][j].first=-1;}}for(int i=1;i<=m;i++){int a=read(),b=read();ban[a]|=(1<<(b-1));}pair<BigNum,BigNum>ans;ans=dfs(1,0);ans.first.print();ans.second.print();fclose(stdin);fclose(stdout);return 0;
}
又强又可爱的Eafoo的AC
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <vector>
#include <cassert>
%:pragma GCC optimize(3)
using namespace std;typedef long long ll;int read() {int x = 0;char c;bool f = 0;while (!isdigit(c = getchar())) {if (c == '-') f = 1;}do {x = (x << 1) + (x << 3) + (c ^ 48);} while (isdigit(c = getchar()));if (f) return -x;return x;
}const int maxn = 5e2 + 1, maxs = (1 << 9);struct Int {ll num[80];Int() { num[0] = 1; }const ll len = 1e17;void Init() { memset(num, 0, sizeof num); num[0] = 1; }Int operator +(const Int &b) const {Int c;c.Init();c.num[0] = max(num[0], b.num[0]);for (int i = 1; i <= c.num[0]; ++i) {c.num[i] += num[i] + b.num[i];if (c.num[i] >= len) {c.num[i] -= len;++c.num[i + 1];}}if (c.num[c.num[0] + 1] > 0) ++c.num[0];return c;}Int operator *(int b) const {Int c; c.Init();c.num[0] = num[0] + 1;for (int i = 1; i <= c.num[0]; ++i) {c.num[i] += num[i] * b;c.num[i + 1] += c.num[i] / len;c.num[i] %= len;}while (c.num[c.num[0]] == 0 && c.num[0] > 1) --c.num[0];return c;}void operator +=(const Int &b) {num[0] = max(num[0], b.num[0]);for (int i = 1; i <= num[0]; ++i) {num[i] += b.num[i];if (num[i] >= len) {num[i] -= len;++num[i + 1];}}if (num[num[0] + 1] > 0) ++num[0];}void operator *=(int b) {++num[0];for (int i = 1; i <= num[0]; ++i) {num[i] += num[i] * (b - 1);num[i + 1] += num[i] / len;num[i] %= len;}while (num[num[0]] == 0 && num[0] > 1) --num[0];}void put() {printf("%lld", num[num[0]]);for (int i = num[0] - 1; i; --i) printf("%017lld", num[i]);}void putln() { put(), putchar('\n'); }
};bool ok[maxs][10];
Int f[2][maxs];
Int sum[2][maxs];
bool ban[10][10];signed main() {#ifndef DEBUGfreopen("hacker2.in", "r", stdin);freopen("hacker2.out", "w", stdout);#endifint n = read(), m = read(), p = read();for (int i = 1; i <= m; ++i) {int a = read(), b = read();ban[b][a] = 1; // b前 没有 a}int Max = 1 << p;for (int i = 0; i < Max; ++i) {for (int j = 1; j <= p; ++j) {bool f = 0;for (int k = 1; k <= p; ++k) {if (!((i >> (k - 1)) & 1)) continue;if (ban[j][k]) { f = 1; break; }}if (!f) ok[i][j] = 1;}}int pi = 0;f[pi][0].num[1] = 1;for (int i = 1; i <= n; ++i) {pi ^= 1;for (int j = 0; j < Max; ++j) f[pi][j].Init(), sum[pi][j].Init();for (int j = 0; j < Max; ++j) {for (int k = 1; k <= p; ++k) {if (!ok[j][k]) continue;int s = j | (1 << (k - 1));f[pi][s] += f[pi ^ 1][j];sum[pi][s] += sum[pi ^ 1][j] * 10;sum[pi][s] += f[pi ^ 1][j] * k;}}}Int ans, ans1;ans.Init(), ans1.Init();for (int i = 0; i < Max; ++i) ans += f[pi][i], ans1 += sum[pi][i];ans.putln();ans1.putln();
}   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_6519.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自制操作系统日志——第十二天

自制操作系统日志——第十二天 从今天开始&#xff0c;我们将花费两天的时间来进行计算机中定时器的制作。有了定时器后&#xff0c;才能够为程序和cpu更加便利的进行计时。可能会稍难一些了&#xff01;&#xff01;&#xff01; 做好准备&#xff0c;冲&#xff01;&#xf…

ConcurrentLinkedQueue解析

概述 ConcurrentLinkedQueue实际对应的是LinkedList,是一个线程安全的无界队列&#xff0c;但LinkedList是一个双向链表&#xff0c;而ConcurrentLinkedQueue是单向链表。ConcurrentLinkedQueue线程安全在于设置head、tail以及next指针时都用的cas操作&#xff0c;而且node里的…

00Android studio安装

目录一.下载Android studio二.安装Android studio三.打开软件一.下载Android studio 官网&#xff1a;https://developer.android.google.cn/studio 下载&#xff1a;由于是国外的网站&#xff0c;国内下载会比较慢 二.安装Android studio 打开&#xff1a; 点击【Next】 点击…

猿创征文|瑞吉外卖——管理端_员工管理

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 专栏&#xff1a;瑞吉外卖 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;一本好书&#xff0c;就像高级武功秘籍一样&#xff0c;哪怕只是从里面领悟到个一招半势&…

C# StringBuilder 底层深入原理分析以及使用详解

目录前言什么是StringBuilderStringBuilder的成员StringBuilder增加元素原理StringBuilder扩容原理Capacity&#xff1a;1&#xff0c;元素数量&#xff1a;0Capacity&#xff1a;1&#xff0c;元素数量&#xff1a;1Capacity&#xff1a;2&#xff0c;元素数量&#xff1a;2Ca…

开学季征文|卷生卷死之新学期大学生自救指南!!!

你好&#xff0c;这里是前情提要 正所谓 “ 宁可卷死自己&#xff0c;也要卷死同学 ” &#xff0c;在这个万物皆卷的时代&#xff0c;“卷”似乎早已与我们变得不可分割血脉相融&#xff0c;有道是卷卷更健康。我也知道卷卷更好&#xff0c;可是天不遂人愿&#xff0c;因为疫情…

Redis_09_Redis集群实现Sentinel哨兵应对高可用

文章目录一、前言二、Sentinel原理2.1 Sentinel原理2.2 Sentinel选主2.3 Sentinel功能小结三、Sentinel实践3.1 Sentinel配置3.2 实践&#xff1a;Sentinel基本使用3.2.1 实践&#xff1a;Sentinel搭建3.2.2 实践&#xff1a;主节点宕机之后的选主过程(Sentinel保证高可用)3.2.…

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法

这个解决办法是我根据网上一系列的方法准备突然成功的&#xff0c;所以我想可能是由于本身其不稳定造成的 首先&#xff0c;我在官网上下载了mysql文件&#xff0c;这个网上随便找都能找到怎么下载的 然后打开文件后&#xff0c;发现没有my.ini 所以我就找了一个文档放了进去…

【线性代数】MIT Linear Algebra Lecture 6: Column space and nullspace

Author&#xff5c; Rickyの水果摊 Time &#xff5c; 2022.9.12 Lecture 6: Column space and nullspace Lecture Info Instructor: Prof. Gilbert Strang Course Number: 18.06 Topics: Linear Algebra Official Lecture Resource: Resource Index of Linear Algebra …

HCIP-双机热备

一,双机热备原理 1.1双机热备简介FW部署在网络出口位置时,如果发生故障会影响到整网业务。为提升网络的可靠性,需要部署两台FW并组成双机热备。双机热备需要两台硬件和软件配置均相同的FW。两台FW之间通过一条独立的链路连接,这条链路通常被称之为“心跳线”。两台FW通过心…

美团面试官:高并发、任务执行时间短的业务怎样使用线程池?

前言 无论是互联网大厂还是一些中游公司的面试基本都会问到多线程与并发编程的知识&#xff0c;所以今天小编在这里做了关于这方面知识的一个笔记分享送给即将面试跳槽的程序员朋友们&#xff01; 首先关于多线程与并发的知识总结了一个思维导图&#xff0c;分享给大家 如果你…

【Pytorch】2022 Pytorch基础入门教程(完整详细版)

一、Pytorch 1.1 简介 Pytorch是torch的python版本&#xff0c;是由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程。Torch 是一个经典的对多维矩阵数据进行操作的张量&#xff08;tensor &#xff09;库&#xff0…

从校园智能门锁预见万物互联的未来

随着物联网、移动互联网、大数据、云计算等信息技术的创新发展&#xff0c;被信息化驱动的教育行业实现了技术深化融合&#xff0c;智慧校园正逐步落地生根、开花结果。校园智能门锁是智慧校园的基础载体&#xff0c;也是实现教育信息化的基础载体。 NO.1校园智能门锁构建一体化…

【CSDN竞赛第五期】“三而竭”采用等比求和公式法的思考

原题题目 一鼓作气再而衰三而竭。 小艺总是喜欢把任务分开做。小艺接到一个任务&#xff0c;任务的总任务量是n。 第一天小艺能完成x份任务&#xff0c;第二天能完成x/k ... ...第t天能完成x/(k^(t-1))。 小艺想知道自己第一天至少完成多少才能完成最后的任务。 公式推导 第一…

[项目管理-25]:高效沟通的利器,结构思考力与树形结构化表达

作者主页(文火冰糖的硅基工坊)&#xff1a;文火冰糖&#xff08;王文兵&#xff09;的博客_文火冰糖的硅基工坊_CSDN博客 本文网址&#xff1a; 目录 前言&#xff1a; 第1章 结构化思考力概述 1.1 非结构化思考力的问题与结构化思路力的好处 1.2 什么是结构化思路力 1.3…

mysql中的mvcc机制

MVCC多版本并发控制 简述MySQL锁 在InnoDB引擎下&#xff0c;按锁的粒度分类&#xff0c;可以分为行锁和表锁。 行锁实际上是作用在索引之上的。当我们的SQL命中了索引&#xff0c;那锁住的就是命中条件内的索引节点(这就是行锁)&#xff0c;如果没有命中索引&#xff0c;那锁…

MySQL的主从复制

MySQL的主从复制 1、概述 主从复制是指将主数据库的 **DDL &#xff08;数据定义语句&#xff09;**和 **DML &#xff08;数据操作语句&#xff09;**操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#…

【flask进阶】Flask实现自定义分页(python web通用)

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域新星创作者。&#x1f61c;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;&#x1f4e3; 系列专栏&#xff1a;flask框架快速入门&a…

springboot学生综合素质测评系统java

本学生综合素质测评系统主要包括登录管理员模块如下&#xff1a;个人中心、学生管理、素质学习管理、我的学习管理、在线论坛、试卷管理、试题管理、系统管理、考试管理&#xff0c;学生&#xff1a;个人中心、我的学习管理、我的收藏管理、考试管理&#xff0c;前台首页&#…

主流的CPU架构

cpu架构 CPU架构是CPU厂商给属于同一系列的CPU产品定的一个规范&#xff0c;是为了区分不同类型CPU的重要标示。目前市面上的CPU分类主要分有两大阵营&#xff0c;一个是intel、AMD为首的复杂指令集CPU&#xff0c;另一个是以IBM、ARM为首的精简指令集CPU。两个不同品牌的CPU&a…