2021.8.6考试总结[NOIP模拟32]
T1 smooth
考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了。
其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的。
为了保证不重,只往编号大的队列中加入即可。
$code:$
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 int b,k,cnt,ans,pos;
5 int pri[21]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
6 queue<int>q[16];
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 inline void write(int x){
14 char ch[20]; int len=0;
15 if(x<0) putchar('-'), x=~x+1;
16 do{
17 ch[len++]=x%10+(1<<5)+(1<<4);
18 x/=10;
19 }while(x);
20 for(int i=len-1;i>=0;--i) putchar(ch[i]);
21 return;
22 }
23 signed main(){
24 b=read(); k=read(); cnt=ans=1;
25 for(int i=1;i<=b;i++) q[i].push(pri[i]);
26 while(cnt<k){
27 cnt++; ans=2e18;
28 for(int i=1;i<=b;i++)
29 if(q[i].front()<ans) ans=q[i].front(), pos=i;
30 q[pos].pop();
31 for(int i=pos;i<=b;i++)
32 q[i].push(ans*pri[i]);
33 }
34 write(ans); putchar('\n');
35 return 0;
36 }
T1
T2 six
看出是个状压,想三进制但没时间了,手模$2$分类讨论还炸了。哈哈
正解神仙。不难理解其实只需知道质因子集合出现的状态,可以预处理出每个集合可以表示的数的数量。
状态数组维护两个状态,分别为当前质因子集合与不同数中出现的质因子对集合。对于后者可以写个类似$hash$的东西来映射。
二进制数很大但状态数不多,可以用$map$维护。具体实现可以记忆化搜索。
$code:$
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 const int p=1e9+7;
5 int n,cnt,pri[10],ans,num[10],sum[1<<10];
6 unordered_map<int,int>f;
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 inline void write(int x){
14 char ch[20]; int len=0;
15 if(x<0) putchar('-'), x=~x+1;
16 do{
17 ch[len++]=x%10+(1<<5)+(1<<4);
18 x/=10;
19 }while(x);
20 for(int i=len-1;i>=0;--i) putchar(ch[i]);
21 return;
22 }
23 void try_del(){
24 for(int i=2;i*i<=n;i++){
25 if(!(n%i)) pri[++cnt]=i;
26 while(!(n%i)) num[cnt]++, n/=i;
27 }
28 if(n!=1) pri[++cnt]=n, num[cnt]=1;
29 }
30 int upd(int a,int b){
31 int res=0;
32 for(int i=0;i<cnt;i++)
33 for(int j=0;j<=i;j++)
34 if(((a&(1<<i))&&(b&(1<<j)))||((a&(1<<j)&&(b&(1<<i))))) res|=(1<<(i*(i+1)/2+j));
35 return res;
36 }
37 bool check(int a,int b){
38 for(int i=0;i<cnt;i++)
39 for(int j=0;j<=i;j++)
40 if((a&(1<<i))&&(a&(1<<j))&&(b&(1<<(i*(i+1)/2+j)))) return 0;
41 return 1;
42 }
43 int dfs(int s,int t){
44 int now=(s<<30)+t;
45 if(f.find(now)!=f.end()) return f[now];
46 f[now]=1;
47 for(int i=1;i<(1<<cnt);i++){
48 if(!check(i,t)) continue;
49 f[now]=(f[now]+sum[i]*dfs(s|i,t|upd(s,i))%p)%p;
50 }
51 return f[now];
52 }
53 signed main(){
54 n=read(); try_del();
55 for(int i=1;i<1<<cnt;i++){
56 sum[i]=1;
57 for(int j=0;j<cnt;j++)
58 if(i&(1<<j)) (sum[i]*=num[j+1])%=p;
59 }
60 write(dfs(0,0)-1); putchar('\n');
61 return 0;
62 }
T2
T3 walker
看到反三角函数直接弃了,混了是个人都能拿的$30pts$。其实在三角函数名前加个$a$就行。
把三个操作合并,一共得到四个未知数:$scale\times cos\theta$,$scale\times sin\theta$,$d_x$,$d_y$。
一组数据$x$,$y$得到两个方程,随机选出两组数据高斯消元后检验即可。
一次高斯消元$O(64)$,检验$O(n)$,单次检验通过的概率是$\frac{1}{4}$,进行$50$次时间没问题,不正确率$(\frac{3}{4})^{50}<10^{-5}$,直接过了。
$code:$
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int NN=1e5;
4 const double eps=1e-6;
5 double x[NN],y[NN],xx[NN],yy[NN],a[10][10];
6 int n,cnt,ra,rb;
7 double sca,arc;
8 inline int read(){
9 int x=0,f=1; char ch=getchar();
10 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
11 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
12 return x*f;
13 }
14 inline void write(int x){
15 char ch[20]; int len=0;
16 if(x<0) putchar('-'), x=~x+1;
17 do{
18 ch[len++]=x%10+(1<<5)+(1<<4);
19 x/=10;
20 }while(x);
21 for(int i=len-1;i>=0;--i) putchar(ch[i]);
22 return;
23 }
24 bool guass(){
25 double temp; int r=1;
26 for(int i=1;i<=4;i++){
27 int h=r;
28 for(int j=r;j<=4;j++) if(fabs(a[j][i])>fabs(a[h][i])) h=j;
29 if(h!=r) for(int j=i;j<=i+1;j++) swap(a[h][j],a[r][j]);
30 if(fabs(a[r][i])<eps) return 0;
31 for(int j=r+1;j<=4;j++){
32 temp=a[j][i]/a[r][i];
33 for(int k=i;k<=5;k++) a[j][k]-=temp*a[r][k];
34 }
35 r++;
36 }
37 for(int i=r;i;i--){
38 for(int j=i+1;j<=4;j++) a[i][5]-=a[i][j]*a[j][5];
39 a[i][5]/=a[i][i];
40 } return 1;
41 }
42 bool check_in_check(int i){
43 if(fabs(x[i]*a[1][5]-y[i]*a[2][5]+a[3][5]-xx[i])>eps) return 0;
44 if(fabs(x[i]*a[2][5]+y[i]*a[1][5]+a[4][5]-yy[i])>eps) return 0;
45 return 1;
46 }
47 bool check(int fi,int se){
48 a[1][1]=x[fi]; a[1][2]=-y[fi]; a[1][3]=1; a[1][4]=0; a[1][5]=xx[fi];//scale*cos
49 a[2][1]=y[fi]; a[2][2]= x[fi]; a[2][3]=0; a[2][4]=1; a[2][5]=yy[fi];//scale*sin
50 a[3][1]=x[se]; a[3][2]=-y[se]; a[3][3]=1; a[3][4]=0; a[3][5]=xx[se];//dx
51 a[4][1]=y[se]; a[4][2]= x[se]; a[4][3]=0; a[4][4]=1; a[4][5]=yy[se];//dy
52 if(!guass()) return 0;
53 int res=0;
54 for(int i=1;i<=n;i++)
55 if(check_in_check(i)) ++res;
56 return res>=(n+1)/2;
57 }
58 signed main(){
59 n=read(); srand(time(0));
60 for(int i=1;i<=n;i++)
61 scanf("%lf%lf%lf%lf",&x[i],&y[i],&xx[i],&yy[i]);
62 while(cnt<50){
63 ++cnt; ra=rand()%n+1; rb=rand()%n+1;
64 while(ra==rb) ra=rand()%n+1, rb=rand()%n+1;
65 if(check(ra,rb)) break;
66 }
67 sca=sqrt(a[1][5]*a[1][5]+a[2][5]*a[2][5]);
68 arc=acos(a[1][5]/sca);
69 if(a[2][5]<0) arc=-arc;
70 printf("%.10lf\n%.10lf\n%.10lf %.10lf\n",arc,sca,a[3][5],a[4][5]);
71 return 0;
72 }
T3
2021.8.6考试总结[NOIP模拟32]的更多相关文章
- 2021.9.17考试总结[NOIP模拟55]
有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...
- 2021.9.13考试总结[NOIP模拟52]
T1 路径 考虑每一位的贡献,第$i$位每$2^i$个数会变一次,那么答案为$\sum_{i=1}^{log_2n} \frac{n}{2^i}$. $code:$ 1 #include<bit ...
- 2021.8.11考试总结[NOIP模拟36]
T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...
- 2021.7.29考试总结[NOIP模拟27]
T1 牛半仙的妹子图 做法挺多的,可以最小生成树或者最短路,复杂度O(cq),c是颜色数. 我考场上想到了原来做过的一道题影子,就用了并查集,把边权排序后一个个插入,记录权值的前缀和,复杂度mlogm ...
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- 2021.9.20考试总结[NOIP模拟57]
(换个编辑器代码就SB地不自动折叠了.. T1 2A 考察快读的写法. $code:$ T1 #include<bits/stdc++.h> #define scanf SCANF=sca ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...
- 2021.9.12考试总结[NOIP模拟51]
T1 茅山道术 仔细观察发现对于每个点只考虑它前面第一个与它颜色相同的点即可. 又仔细观察发现对一段区间染色后以这个区间内点为端点的区间不能染色. 于是对区间右端点而言,区间染色的贡献为遍历到区间左端 ...
- 2021.9.9考试总结[NOIP模拟50]
T1 第零题 神秘结论:从一个点满体力到另一个点的复活次数与倒过来相同. 于是预处理出每个点向上走第$2^i$个死亡点的位置,具体实现可以倍增或二分. 每次询问先从两个点同时向上倍增,都转到离$LCA ...
随机推荐
- Identity用户管理入门一(框架搭建)
理论知识微软官方文档最完整,最详细,这里只一步步的介绍如何使用,地址:https://docs.microsoft.com/zh-cn/aspnet/core/security/authenticat ...
- VUE001. 拖动div盒子(自定义指令v-directives)
拖动div是一个逻辑很简单的需求,监听容器的鼠标按下松开的事件,执行函数通过DOM改变标签的CSS偏移量. 在VUE构建的项目中,通过标签的 @mousedown 和 @mouseup 赋予行为事件, ...
- NOIP模拟51
樱花满地集于我心,楪舞纷飞祈愿相随 前言 太菜了,人手切掉两个题,我竟然一道都不会.. 改 T3 的时候整个人的心态都崩掉了,一部分原因可能是语文素养不高导致我看不懂题解. 另一部分可能就是系太不太好 ...
- Playfield 类方法的注释
前言 本篇随笔的底包采用的是百度炉石兄弟吧20200109折腾版中自带的 routines 文件. 本次仅为绝大多数方法添加 xml 注释和简单解析,没有具体解析与重构. Playfield 类方法众 ...
- Apache Dolphin Scheduler - Dockerfile 详解
Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化 DAG 工作流任务调度系统.简称 DS,包括 Web 及若干服务,它依赖 PostgreSQL 和 Zookeep ...
- 洛谷P1125——笨小猴(简易模拟)
https://www.luogu.org/problem/show?pid=1125 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去 ...
- PHP中的文件系统函数(一)
从这篇文章开始,我们将学习一系列的 PHP 文件系统相关函数.其实这些函数中,有很多都是我们经常用到的,大家并不需要刻意地去记住它们,只要知道有这么个东西,在使用的时候记得来查文档就可以了. 文件路径 ...
- CSS linear-gradient() 函数
用于背景颜色渐变或画线条等场景 linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片. 创建一个线性渐变,需要指定两种颜色,还可以实现不同方向(指定为一个角度)的渐变效 ...
- phpstrom 在smarty 中tpl模版注释怎么修改?
{*<div class="col-sm-10">*} phpstorm注释tpl文件代码为上面,但是这个不符合本框架的注释方式,会报错,需要调整为: <!-- ...
- 用 shell 脚本做命令行工具扩展
问题的提出 公司开发机与远程服务器之间有严格的隔离策略,不能直接使用 ssh 登录,而必需通过跳板机.这样一来,本地与服务器之间的一些文件传输变得非常不便.经过咨询,运维教了我一招: $ nc -l ...