省选数学专题

news/2024/12/21 12:10:53/文章来源:https://www.cnblogs.com/hzoi-Cu/p/18619812

难度升序排序(大概吧)。

[AGC016C] +/- Rectangle

签,虽然国集作业。
贪心是显然的,不说了,这里只考虑正数如何填。

如果\(H\times W-\left\lfloor\frac{H}{h}\right\rfloor\times h\times \left\lfloor\frac{W}{w}\right\rfloor\times w\le \left\lfloor\frac{H}{h}\right\rfloor\times \left\lfloor\frac{W}{w}\right\rfloor\)时,此时全填\(1\)肯定不行,那么要填的就是正整数\(k\),使得\(k\times(H\times W-\left\lfloor\frac{H}{h}\right\rfloor\times h\times \left\lfloor\frac{W}{w}\right\rfloor\times w)< \left\lfloor\frac{H}{h}\right\rfloor\times \left\lfloor\frac{W}{w}\right\rfloor\)。实测\(500\)左右即可。

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t;i += p)
#define drep(i,s,t,p) for(int i = s;i >= t;i -= p)
#ifdef LOCALauto I = freopen("in.in","r",stdin),O = freopen("out.out","w",stdout);
#elseauto I = stdin,O = stdout;
#endif
using ll = long long;using ull = unsigned long long;
using db = double;using ldb = long double;
signed main(){cin.tie(nullptr)->sync_with_stdio(false);int H,W,h,w;cin>>H>>W>>h>>w;if(H%h == 0 && W%w == 0) return cout<<"No\n",0;cout<<"Yes\n";rep(i,1,H,1){rep(j,1,W,1)if(i%h == 0 && j%w == 0) cout<<-(h*w-1)*500-1<<' ';else cout<<500<<' ';cout<<'\n';}
}

[JLOI2015] 骗我呢

反射容斥板子,写详细一点当反射容斥学习笔记了。

先考虑反射容斥是什么。

前置知识

在一个二维平面内,只能向右走或向上走,从\((0,0)\)走到\((n,m)\)的方案数是\(\mathrm{C}_{n+m}^n\)的,下文中,若无特殊说明,那么\(P(n,m)\)均表示从\((0,0)\)只能向右走或向上走走到\(n,m\)的方案数,即\(P(n,m)=\mathrm{C}_{n+m}^n\)

证明

发现每种合法路径必然走了\(n+m\)步,且有\(n\)步向右,\(m\)步向上。所以答案就是从\(n+m\)步中选\(n\)步为向右走的方案数,即\(\mathrm{C}_{n+m}^n\)

考虑如果有一条直线\(y=x+b\)不可碰撞(\(n+b>m\))。考虑一个经典trick,就是将所有碰到这条直线的路径,从第一次碰到这条直线处翻折,那么这条路径的终点就是\((m-b,n+b)\)。举个例子(\(y=x+1,n=m=3\))。

image

显然答案就是\(P(n,m)-P(m-b,n+b)\)。至于为什么不考虑碰撞两次的,因为每次翻折以后都重合了,没必要考虑。

反射容斥

已经解决了只不允许碰撞一条线的,那么如果存在两条线(\(A:y=x+a,B:y=x+b\;(b<a,n+b<m<n+a)\))呢?

考虑不合法的方案形如依次经过\(AABBABAB\),显然重复经过同一条直线没有意义,所以缩成\(ABABAB\)

显然答案为总方案数\(-A\ldots-B\ldots\),发现后面的东西是递推的,直接求就行了。

关于本题

\(x_{i,j}<x_{i,j+1}\),可知每一行是从左到右单调递增的,由\(0\le x_{i,j}\le m\)可知,每行一定有一个数没有被用上,那么就设\(f_{i,j}\)表示第\(i\)行第\(j\)个数没有填过,考虑转移。由\(x_{i,j}<x_{i-1,j+1}\)可知,\(f_{i,j}=\sum\limits_{k=0}^{j+1}f_{i-1,k}\),可以手动模拟证明上界为\(j+1\),显然答案为\(f_{n+1,m}\),前缀和优化可以做到\(O(nm)\)

考虑优化这个柿子,会发现\(f_{i,j}=f_{i,j-1}+f_{i-1,j+1}\),然后将其画到二维平面上,注意这里\(n\)为纵坐标。

image

感觉这个不好看,把它拉伸一下。(图是贺的)

image

发现就是从\((0,0)\)走到\((n+m+1,n)\),且不碰\(A:y=x+1,B:y=x-m-2\)的方案数,直接套反射容斥就行了,时间复杂度\(O(n)\)

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t;i += p)
#define drep(i,s,t,p) for(int i = s;i >= t;i -= p)
#ifdef LOCALauto I = freopen("in.in","r",stdin),O = freopen("out.out","w",stdout);
#elseauto I = stdin,O = stdout;
#endif
using ll = long long;using ull = unsigned long long;
using db = double;using ldb = long double;
const int N = 3e6 + 10,MN = 3e6,mod = 1e9 + 7;
int n,m,fac[N],inv[N];
int qpow(int a,int b,int mod){int res = 1;for(;b;b >>= 1,a = 1ll*a*a%mod)if(b & 1) res = 1ll*res*a%mod;return res;
}
int Inv(int a,int mod = mod){return qpow(a,mod-2,mod);}
int C(int n,int m){if(n < 0 || m < 0 || m > n) return 0;return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
void flip(int &a,int &b,int x){swap(a,b);a -= x;b += x;}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>m;fac[0] = 1;rep(i,1,MN,1) fac[i] = 1ll*fac[i-1]*i%mod;inv[MN] = Inv(fac[MN]);drep(i,MN-1,0,1) inv[i] = 1ll*inv[i+1]*(i+1)%mod;int ans = C(n*2+m+1,n);int x = n + m + 1,y = n;while(x >= 0 && y >= 0){flip(x,y,1);ans -= C(x+y,x);ans += mod;ans %= mod;flip(x,y,-(m+2));ans += C(x+y,x);ans %= mod;}x = n + m + 1,y = n;while(x >= 0 && y >= 0){flip(x,y,-(m+2));ans -= C(x+y,x);ans += mod;ans %= mod;flip(x,y,1);ans += C(x+y,x);ans %= mod;}cout<<ans<<'\n';
}

[AGC049D] Convex Sequence

模拟赛原,但是当时没改。

考虑将\(2\times a_i\le a_{i-1}+a_{i+1}\)换成\(a_i-a_{i-1}\le a_{i+1}-a_i\),发现这就是告诉你斜率单调递增。

假设最小值所在位置为\(p\),那么显然有\(\forall 1\le i<p,a_i<a_{i-1},\forall p< i\le n,a_i<a_{i+1}\)

假设某一个合法方案的第一个最小值所在位置为\(p\),那么显然可以通过以下的流程还原这个方案。

  1. \(a\)中的所有数设为\(C\),此操作只会再最开始进行一次。
  2. 选择一个\(i<p\),将\(a_i,a_{i-1},\ldots,a_1\)加上\(1,2,3,\ldots\),此操作可以进行任意次。
  3. 选择一个\(i>p\),将\(a_i,a_{i+1},\ldots,a_n\)加上\(1,2,3,\ldots\),此操作可以进行任意次。

当固定\(p\)时,那么显然问题转化为:有任意多个\(n,1,3,6,10,\ldots\),求凑出和为\(m\)的数有多少种方案。

注意\(p\)的定义为第一个最小值所在的位置,所以前面的数至少都加过一次,所以需要凑出的数实际为\(m-p\times (p-1)/2\)

剩下的,发现就是一个完全背包问题,但是每次重新做的话复杂度是\(O(nm\sqrt{m})\)的。不可接受。发现这个dp是可撤销的,每次统计答案前直接撤销即可,发现每个最多会撤销\(\sqrt m\)个数,每次撤销复杂度是\(O(m)\)的。所以总的时间复杂度就是\(O(m\sqrt m)\)

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t;i += p)
#define drep(i,s,t,p) for(int i = s;i >= t;i -= p)
#ifdef LOCALauto I = freopen("in.in","r",stdin),O = freopen("out.out","w",stdout);
#elseauto I = stdin,O = stdout;
#endif
using ll = long long;using ull = unsigned long long;
using db = long double;using ldb = long double;
const int N = 1e5 + 10,mod = 1e9 + 7;
int n,m,f[N];
signed main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>m;f[0] = 1;auto Add = [&](int x){rep(i,x,m,1) f[i] = (f[i] + f[i-x])%mod;};auto Del = [&](int x){drep(i,m,x,1) f[i] = (f[i] - f[i-x] + mod)%mod;};if(n <= m) Add(n);for(ll i = 1;i < n && i*(i+1)/2 <= m; ++i) Add(i*(i+1)/2);int ans = 0;rep(i,1,n,1){if(1ll*i*(i-1)/2 <= m) ans = (ans + f[m-i*(i-1)/2])%mod;if(1ll*(n-i)*(n-i+1)/2 <= m) Del((n-i)*(n-i+1)/2);if(1ll*i*(i+1)/2 <= m) Add(i*(i+1)/2);}cout<<ans<<'\n';
}

[ABC221H] Count Multiset

套路:多重集合转不下降序列。

先不考虑限制,设\(f_{i,j}\)表示已经填了\(i\)个数,和为\(j\)的方案数。将多重集合转为不下降序列,那么就有两种操作。

  1. 将一个\(0\)填入,有\(f_{i,j}=f_{i-1,j}\)
  2. 将全局加一,有\(f_{i,j}=f_{i,j-i}\)

但是有相同的数不能出现超过\(m\)次,那么就是限制连续填入\(0\)的次数为\(m\),那么第一种操作的贡献为\(\sum\limits_{k=1}^mf_{i-k,j}\),但由于不知道\(f_{i,j}\)中有多少个\(0\),考虑再设一个dp数组\(g_{i,j}\)表示当前填了\(i\)个数,总和为\(j\),且序列中不含\(0\)的方案数,那么有转移方程\(g_{i,j}=f_{i,j-i}\)

总的转移方程就是

\[f_{i,j}=f_{i,j-i}+\sum_{k=1}^mg_{i-k,j} \]

\[g_{i,j}=f_{i,j-1} \]

前缀和优化可以做到\(O(n^2)\)

点此查看代码
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t,p) for(int i = s;i <= t;i += p)
#define drep(i,s,t,p) for(int i = s;i >= t;i -= p)
#ifdef LOCALauto I = freopen("in.in","r",stdin),O = freopen("out.out","w",stdout);
#elseauto I = stdin,O = stdout;
#endif
using ll = long long;using ull = unsigned long long;
using db = long double;using ldb = long double;
const int N = 5e3 + 10,mod = 998244353;
int n,m,f[N][N],g[N][N],sum[N][N];
signed main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>m;rep(i,1,n,1){if(i <= m) f[i][0] = 1;rep(j,1,n,1){if(j >= i) g[i][j] = f[i][j] = f[i][j-i];sum[i][j] = (sum[i-1][j] + g[i][j])%mod;f[i][j] = (0ll + f[i][j] + sum[i-1][j] - sum[max(0,i-m-1)][j] + mod) % mod;}}rep(i,1,n,1) cout<<g[i][n]<<'\n';
}

\(to\; be\; continued\)

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

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

相关文章

《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验

第四十五章 人脸识别实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/A…

【寒武纪mlu220模型移植】(一)目标检测YoLoV8

前言:目标检测可能是大家用的比较多的,先完善这一篇吧。yolov5的导出可以参考官方文档。并且博主比较懒,已经做过一遍的事情,不想验证第二遍,如果有步骤错误或者疏漏导致中间遇到了问题,可以先自己debug,流程大致就是这样的。 一、修改源码首先是拉取yolov8最新的源码,…

基于钜泉计量AD的电表应用专题推荐(ATT7053D、HT7136、HT7627S-E

关于电力仪表上应用专题介绍,钜泉电能计量、PA驱动、Flash存储HiTrend(钜泉)电能计量芯片 单相计量ADC:ATT7053D,ATT7053C,HT7017,HT7017C 三相计量ADC:HT7036、HT7038、ATT7022E、HT7136、HT7132、HT7032-L 单相计量SOC:HT5019、HT5017,HT5025、HT5029,HT5033,HT503…

AI视频抠图来了!还可以替换视频背景,附下载链接

虽然人工智能正在飞速发展中,图像处理技术也在不断升级,但视频背景去除一直都是图像处理任务中最具挑战性的难题之一 Clipper是一款专注于高精度图像分割的AI工具,用于图像和视频的背景去除,允许用户直接输出透明背景(自定义颜色)的视频文件,还提供用一张图片或者其它视…

习题10.3

import numpy as np import statsmodels.formula.api as smf import matplotlib.pyplot as plt# 加载数据 a = np.loadtxt(data10_3.txt)# 设置绘图参数 plt.rc(text, usetex=True) # 启用 LaTeX 字体 plt.rc(font, size=16) # 设置字体大小 plt.style.use(default) # 使用默…

浅谈一下本机、服务器、docker-compose 容器之间网络通信

一、首先,先区分四个对象,它们分别有自己的网络 1、云服务器上,应用服务容器网络(app,nginx,mysql,redis等)app.net 2、云服务器上,模型服务容器网络(ai服务) 模型网络 ai.net 3、云服务器上:宿主机网络(服务器本机) 服务器本机网络 host.net 4、本机:本地网络 loca…

习题10.1

import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt def check(data): # 提取数据的第一列和第二列 x = data[:, 0] y = data[:, 1] # 使用statsmodels进行线性回归分析 model = sm.OLS(y, sm.add_constant(x)).fit() # 添加常数项 print(mode…

static修饰成员的特点及static修饰成员变量内存图解-java se进阶 day01

1.static介绍 static是静态的意思,它可以用于修饰成员变量和成员方法2.static的特点1.被static修饰了的成员变量,可以被类中的所有对象所共享 虽然stu02没有给school赋值,但是我们用stu02调用时依旧成立,并且打印了南昌交通学院,因为school被共享了,恰好stu01又为其赋值了…

IIS运行遇到问题

1:打开网站时出现的错误提示2:下载对应的.net core Runtime后正常,如下图所示

【最短路】

【最短路算法系统概述】

【Python逆向】深入Pyd逆向

pyd 文件是编译生成的 Python 扩展模块,是类似 so、dll 的一种 Python 文件。 pyd 文件无法像 pyc文件那样恢复源码,只能通过逆向手段去恢复逻辑。 一、理解pyd文件 1.1 编译pyd 自己编译一个 pyd 保留符号来看。 test.py: import base64 key = [ord(i) for i in "key&…

React之Json编辑器

我们先看下效果,这个白色是不是非常不错?没有太多复杂的功能,就是当一个简洁显示json并且进行编辑的功能接下来是代码部分 import AceEditor from react-ace; import { Button, Modal } from antd; import ./styles.css;// Import ace editor themes and modes import ace-b…