noip模拟32[好数学啊]
noip模拟32 solutions
真是无语子,又没上100,无奈死了
虽然我每次都觉得题很难,但是还是有好多上100的
战神都200多了,好生气啊啊啊
从题开始变难之后,我的时间分配越来越不均匀,导致每次都没有时间做最后一题
今天直接挂掉了30pts,因为最后一题没有注意部分分。。
T1 smooth
这个最简单了,我考场上一秒出80pts做法,直接一波set维护
自带排序和去重,完全不必担心,就是时间复杂度多了个log
80pts.set
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
const int N=1e5+5;
const ll maxn=1e18;
int b,k;
ll pt[N],tot;
ll p[25]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
set<ll> st;
int sum;
signed main(){
scanf("%d%d",&b,&k);
if(k==1){
printf("1");
return 0;
}
st.insert(1);
while(st.size()){
set<ll>::iterator it=st.begin();
ll tmp=*it;
sum++;//cout<<*it<<endl;
//cout<<sum<<endl;
if(sum==k){
printf("%lld",tmp);
return 0;
}
for(re i=1;i<=b;i++){
if(sum+st.size()-1>=k&&tmp*p[i]>*st.rbegin())break;
if(tmp<=maxn/p[i])
st.insert(tmp*p[i]);
}
st.erase(it);
}
}
所以考完之后,看一眼题解瞬间就明白了,直接用队列维护,不用优先队列,
使用15个优先队列就够了,
因为我们每次都取所有队列头的最小值,保证了每次取出来的都是最小的
那么我们更新后面的答案的时候,只能向队列头最小的那个队列的后面的队列更新值
因为我们要去重,每一个这样更新出来的值,
一定是由一个质数乘上一个队列头最小值出来的,
而这个队列头又是由他的前面的队列头的最小值更新的,
这样每次都是小的乘大的,直接保证了不重不漏。。。
AC_code
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
const ll inf=0x3f3f3f3f3f3f3f3f;
ll b,k;
ll p[25]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
queue<ll> q[16];
signed main(){
scanf("%lld%lld",&b,&k);
for(re i=1;i<=b;i++)q[i].push(p[i]);
ll mn,who;
if(k==1){
printf("1");
return 0;
}
for(re i=1;i<k;i++){
mn=inf,who;
for(re j=1;j<=b;j++)
if(mn>q[j].front())
mn=q[j].front(),who=j;
q[who].pop();
for(re j=who;j<=b;j++){
q[j].push(mn*p[j]);
}
}
printf("%lld",mn);
}
T2 six
这个题真的是神题,二维状压,真牛逼!!!
我是从这个题才第一次接触到二维状压的
所以其实这个题我是在zxb的指点之下才明白的,原来这个题是这么压的
对于一般的状压来说,我们只需要压这一位是否出现了,
但是这个题他不一样,因为你无法区分2、3和6
当你要加入一个6的时候,你发现当前的序列里已经有了2、3这两个质数
如果就是2、3这两个数,那么6就不能放进去了,但是如果是6的话,那还可以继续放
这是我们最难区分的点,所以我们需要把这两种情况分开,
对于每个可以放到序列里的数来说,最多包含6个质数,所以我们就直接标记他的每一个质数
这时候你肯定会大叫,这什么玩意,举个例子:
B为6,那么2是他的第一个质因子,3是第二个
2:01=1
3:10=2
6:11=3
我们把这些数拆成这样的状态,所以这就是为什么数据范围只有6
我们再对这些拆分进行状压,判断这样的数是否存在,直接用map记忆化搜索就完了
AC_code
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define pa pair<long long,long long>
#define mpa(x,y) make_pair(x,y)
#define fi first
#define se second
const ll mod=1e9+7;
ll n;
map<pa,ll> mp;
ll sum[1<<6],id[1<<6];
pa ys[10];
int top;
ll dfs(ll s1,ll s2){
map<pa,ll>::iterator it=mp.find(mpa(s1,s2));
if(it!=mp.end())return it->se;
mp.insert(mpa(mpa(s1,s2),1));
it=mp.find(mpa(s1,s2));
for(re i=1;i<(1<<top);i++){
int num=0;
bool flag=0;
for(re j=1;j<(1<<top);j++){
if(!(i&j))continue;
if((s1>>j-1)&1)num++;
if((s2>>j-1)&1)flag=1;
if(flag||num>=2)break;
}
if(flag||num>=2)continue;
if((s1>>i-1)&1)it->se=(it->se+sum[i]*dfs(s1^(1ll<<i-1),s2|(1ll<<i-1))%mod)%mod;
else it->se=(it->se+sum[i]*dfs(s1|(1ll<<i-1),s2)%mod)%mod;
}
return it->se;
}
signed main(){
scanf("%lld",&n);
for(ll i=2;i*i<=n;i++){
if(n%i)continue;
ys[++top].fi=i;
while(n%i==0){
ys[top].se++;
n/=i;
}
}
if(n!=1)ys[++top].fi=n,ys[top].se=1;
for(re i=1;i<=top;i++)id[1<<i-1]=i;
sum[0]=1;for(re i=1;i<(1<<top);i++)
sum[i]=sum[i^(i&(-i))]*ys[id[i&(-i)]].se%mod;
printf("%lld",dfs(0,0)-1);
}
考场上我直接去容斥了,然后发现,这个好像和顺序有关,2、3、6不行,但是2、6、3可以
T3 walker
这个简单哈哈哈,虽然我考场上写都没写
但是我还没见过这么出题的,竟然让我搞随机化,让我枚举50组数据,一定能找到答案
还统计了一下失败的概率,这就靠人品了,rp++
就每次枚举两组数据,直接高斯约旦求解
注意找这个角度的时候,判断是正的还是负的,要不然WA死
AC_code
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define pa pair<long long,long long>
#define mpa(x,y) make_pair(x,y)
#define fi first
#define se second
const ll mod=1e9+7;
ll n;
map<pa,ll> mp;
ll sum[1<<6],id[1<<6];
pa ys[10];
int top;
ll dfs(ll s1,ll s2){
map<pa,ll>::iterator it=mp.find(mpa(s1,s2));
if(it!=mp.end())return it->se;
mp.insert(mpa(mpa(s1,s2),1));
it=mp.find(mpa(s1,s2));
for(re i=1;i<(1<<top);i++){
int num=0;
bool flag=0;
for(re j=1;j<(1<<top);j++){
if(!(i&j))continue;
if((s1>>j-1)&1)num++;
if((s2>>j-1)&1)flag=1;
if(flag||num>=2)break;
}
if(flag||num>=2)continue;
if((s1>>i-1)&1)it->se=(it->se+sum[i]*dfs(s1^(1ll<<i-1),s2|(1ll<<i-1))%mod)%mod;
else it->se=(it->se+sum[i]*dfs(s1|(1ll<<i-1),s2)%mod)%mod;
}
return it->se;
}
signed main(){
scanf("%lld",&n);
for(ll i=2;i*i<=n;i++){
if(n%i)continue;
ys[++top].fi=i;
while(n%i==0){
ys[top].se++;
n/=i;
}
}
if(n!=1)ys[++top].fi=n,ys[top].se=1;
for(re i=1;i<=top;i++)id[1<<i-1]=i;
sum[0]=1;for(re i=1;i<(1<<top);i++)
sum[i]=sum[i^(i&(-i))]*ys[id[i&(-i)]].se%mod;
printf("%lld",dfs(0,0)-1);
}
noip模拟32[好数学啊]的更多相关文章
- Noip模拟32(再度翻车) 2021.8.7
T1 Smooth 很水的一道题...可是最傻 的是考场上居然没有想到用优先队列优化... 上来开题看到这个,最一开始想,这题能用模拟短除法,再一想太慢了,就想着优化 偏偏想到线性筛然后试别的素 ...
- 2021.8.6考试总结[NOIP模拟32]
T1 smooth 考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了. 其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的. 为了保证不重, ...
- NOIP模拟:切蛋糕(数学欧拉函数)
题目描述 BG 有一块细长的蛋糕,长度为 n. 有一些人要来 BG 家里吃蛋糕, BG 把蛋糕切成了若干块(整数长度),然后分给这些人. 为了公平,每个人得到的蛋糕长度和必须相等,且必须是连续的一段 ...
- 2018.10.20 NOIP模拟 面包(数学期望)
传送门 把方差的式子拆开. 方差=平方的期望-期望的平方. 显然只用维护点对的个数和总方案数就行了. 利用分步的思想来统计. 要统计覆盖一个矩形(x1,y1,x2,y2)(x1,y1,x2,y2)(x ...
- NOIP模拟 32
我在31反思中膜拜过了B哥 没想到这次又... 我给老姚家丢脸了...STO 首先T1暴力就写挂了... 贪图从$n^3$*$2^n$优化成$n^2$*$2^n$然后打错了 哗哗的扔分 而且正解都想不 ...
- NOIP 模拟 $32\; \rm Walker$
题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\ ...
- NOIP 模拟 $32\; \rm Six$
题解 二维状压. 第一维直接压选不同质因子的方案,第二位压方案. 分两种讨论,显然一种方案最多出现两次,否则就不合法了,所以一种是出现了一次的,另一种是出现了两次的,这样可以减小状态数. 实现可以用 ...
- NOIP 模拟 $32\; \rm Smooth$
题解 \(by\;zj\varphi\) 很简单的贪心题. 开 \(B\) 个队列,每个队列存最后一次乘上的数为当前队列编号的数. 每次去所有队列中队首的最小值,不用开堆,因为开堆用于将所有数排序,但 ...
- noip模拟32
\(\color{white}{\mathbb{山高而青云冷,池深而蛟穴昏,行以慎步,援以轻身,名之以:落石}}\) 开题发现 \(t1\) 80分特别好写,于是先写了 但是这个做法没有任何扩展性,导 ...
随机推荐
- 02 SVN 与 Git 的优缺点
上一篇博客大致聊了聊关于版本控制系统的周边,这一篇我们就来继续唠唠作为近年来最受欢迎的两个版本控制系统的优缺点吧. 聊优缺点之前,先简单了解一下这两个这两个版本控制系统好了: 关于 SVN SVN 概 ...
- uniapp 打包IOS 更新AppStore版本
Hello 你好,我是大粽子. 最近随着新版本UI的发布APP也随之更新,随之而来的也就是IOS程序提审步骤,这次我详细的截图了每一个步骤,如果你正好也需要那么跟着我的节奏一步步来肯定是没问题的. 提 ...
- Docker 镜像针对不同语言的精简策略
导航: 这里分为几个部分. 相关转载云原生:米开朗基杨 1.Docker减小镜像体积 2.Docker镜像针对不同语言的精简策略 对于刚接触容器的人来说,他们很容易被自己制作的 Docker 镜像体积 ...
- 乘风破浪,Windows11设计和开发指导,全新图标字体和云母材质
Windows11全新的布局设计 Windows 11全新的布局设计已设计为支持现代应用体验.渐进的圆角.嵌套元素和一致的排水沟相结合,营造出柔和.平静.平易近人的效果,强调目的的统一和易用性. ht ...
- 关于Ubuntu的超级管理员Root的切换及初始密码设置
背景介绍 总有一些操作,可能需要更高的超级管理员权限才能进行,甚至才可见有些文件,所以在Linux中我们需要切换到Root用户,也就是对应的Windows的Administrator账户. 从当前用户 ...
- DL基础补全计划(二)---Softmax回归及示例(Pytorch,交叉熵损失)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- ExtJs4学习(九)读写器reader、writer
Ext.data.reader.Json JSON Reader是用一个代理来读取服务端响应的JSON格式的返回值. 一般用于将结果加载成一个存储集-例如我们将创建一些如下东西: Ext.define ...
- redis学习笔记(一)——windows下redis的安装与配置
前言 很久没有写东西了(.......我的水平就是记个笔记),北漂实习的我,每天晚上回来都不想动,但是做为社会主义接班人的我,还是要时刻给自己充充电,趁着年轻,趁着日渐脱发的脑袋还没有成为" ...
- LVM拓展报错及处理
LVM拓展报错: root@ming:/# lvextend -L +100G /dev/ubuntu-vg/root Insufficient free space: 25600 extents ...
- 每日英语——the rest of my life
<the rest of My life> 词面意思:我的余生 实际意思:我的余生 1. 歌曲:<The Rest of My life> Less Than Jake 歌词 ...