T1 Smooth


很水的一道题。。。可是最傻    的是考场上居然没有想到用优先队列优化。。。

上来开题看到这个,最一开始想,这题能用模拟短除法,再一想太慢了,就想着优化

偏偏想到线性筛然后试别的素数是不是他的因数,比较离谱当时为什么会觉得这样快。。。

然后还在试图精准卡时限,感觉自己像时间管理带师(??),总之就非常逗    。

后来发现这种做法不仅没有正确性(因为素数可能筛不完),而且还慢。。。

就放弃了直接打了一手短除,拿到除了暴零以外的全场最低$20$,长个教训吧。。。。。

据说正解跟蚯蚓很像,但是没做过不慌,毕竟场上想到正解思路,但是没有想到如何快速找最小值

考后一听别人讨论优先队列就知道该怎么打了,然后不到半个小时就$A$了

奈何考场上像一个傻    。。。。。


总共就最多$15$个质数,对于每一个质数都开一个队列,其实不用优先队列

可以发现每个合理的$B-Smooth$数都是由$prime_b$之前的质数随便组合相乘得到的

那么每次从所有的队列首找到最小的,为了不重复让他乘上比他大的还小于$prime_b$的质数

依次放入那种质数的队列中,然后到$k$位置直接输出就行。

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 int b,k,p[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67},cnt;
5 queue<int> Q[20];
6 namespace WSN{
7 inline short main(){
8 scanf("%lld%lld",&b,&k);
9 for(int i=1;i<=b;i++) Q[i].push(p[i]);cnt=1;
10 while(1){
11 int minn=1e18,pos=0;
12 for(int i=1;i<=b;i++) if(minn>Q[i].front())
13 minn=Q[i].front(),pos=i;
14 Q[pos].pop();++cnt; if(cnt==k){printf("%lld\n",minn);break;}
15 for(int i=pos;i<=b;i++)
16 Q[i].push(minn*p[i]);
17 }
18 return 0;
19 }
20 }
21 signed main(){return WSN::main();}

T2 Six

首先要理解:组成数列中唯一的限制都只跟这个数的质因数有关,跟其他的约数无关。

原因:任意一个数都可以表示为质因数相乘的形式,那么他的约数也都跟质因数不互质,

所以关于题目里面加入一个约数,保证其与前面的数至多有一个不互质,

就是说质因数在这个数列中不可以出现两次以上(单独出现也好,还是在一个约数的质因数里面也好,都不可以出现两次以上)。

解释完后,题意就被转化了,看似巨大的测试数据也就缩小到很小了,六位的状压。

剩下就是枚举集合,进行记忆化搜索就行了,直接口胡说不清,代码里面有注释。

 1 #include<bits/stdc++.h>
2 #define int long long
3 #define pii pair<int ,int>
4 #define mp make_pair
5 #define num first
6 #define cnt second
7 using namespace std;
8 const int NN=1000005,mod=1e9+7;
9 int N,rp,sum[1<<7];//sum数组记录的是在状态sta(表示选择了哪些质数组成N)下的所有成立的N有几种
10 pii p[7];//记录质因数及其指数,其实只记录指数即可
11 unordered_map<int ,int > dp;//记录每一种状态对应的方案数
12 inline int cal(int S,int T){//就是在求dfs中的T集合,注意这里的T集合与dfs中的不同,S,T单是表示选择的质数
13 int ans=0;
14 for(int i=0;i<rp;i++) for(int j=0;j<=i;j++)
15 if( ( (S>>i&1) && (T>>j&1) ) || ( (T>>i&1) && (S>>j&1) ) ) ans|=1<<(i*(i+1)/2+j);
16 //如果S,T中包含两个元素i,j,就将其打包装入T集合,那个给ans赋值柿子那么奇妙是因为他的实质就是hash,只是为了去重的手段
17 return ans;
18 }
19 inline bool check(int S,int T){
20 for(int i=0;i<rp;i++) for(int j=0;j<=i;j++)
21 if( ( (S>>i&1) && (S>>j&1) ) && (T>>(i*(i+1)/2+j)&1)) return 0;//如果S中有i,j这两个元素,且T中有这两个互质对
22 return 1;
23 }
24 inline int dfs(int S,int T){//S集合表示选择了哪几种质数,T集合表示组成的质数对,其中的位数没有直接含义,具体见尻函数
25 int now=(S<<30)+T;
26 if(dp.find(now)!=dp.end()) return dp[now];
27 dp[now]=1;
28 for(int i=1;i<(1<<rp);i++) if(check(i,T))
29 (dp[now]+=sum[i]*dfs(S|i,T|cal(S,i))%mod)%=mod;//枚举可能的集合,进行状态转移
30 return dp[now];
31 }
32 namespace WSN{
33 inline short main(){
34 scanf("%lld",&N);
35 for(int i=2;i<=sqrt(N);i++){
36 if(N%i!=0) continue;
37 p[++rp].num=i;
38 while(N%i==0) ++p[rp].cnt,N/=i;
39 }if(N!=1) p[++rp]=mp(N,1);//对N进行质因数拆分
40 /* for(int i=1;i<=rp;i++)
41 cout<<p[i].num<<" "<<p[i].cnt<<endl;*/
42 for(int i=1;i<(1<<rp);i++){//预处理sum数组
43 sum[i]=1;
44 for(int j=0;j<rp;j++)
45 if(i>>j&1) (sum[i]*=p[j+1].cnt)%=mod;//注意j+1,容易忘
46 }
47 printf("%lld\n",dfs(0,0)-1);
48 return 0;
49 }
50 }
51 signed main(){return WSN::main();}

带注释

T3 Walker

考场上一看弧度和三角函数的转化就傻了,根本没学过。。

看一眼数据范围乐开花,有$30$分压根不用思考。。。。。

正解果然是高斯消元,不过使用方法极为奇妙。。。

真就正解随机化

复杂度$O(4^3rp)$,比较喜人。。。。

随机出来两个人,将其$x,y$作为常数列出$4*5$的行列式消元,

只要有唯一解就用其进行回代判断$\frac{1}{2}$的条件。

计算五十组,全部找不到正确的解的概率为$(\frac{3}{4})^50$

最后,有一个东西叫——

精度

很烦人,一旦不对就是一下午望穿秋水,啥也调不出来。。。。。。

 1 #include<bits/stdc++.h>
2 #define wsn double
3 using namespace std;
4 const int NN=1e5+5;
5 int n;
6 wsn g[6][6];
7 struct node{wsn x,y;}p1[NN],p2[NN];
8 inline int Gauss(int n){
9 int cnt=1;
10 for(int i=1;i<=n;i++){
11 int r=cnt;
12 for(int j=cnt;j<=n;j++) if(fabs(g[j][i])>fabs(g[r][i])) r=j;
13 if(fabs(g[r][i])<1e-5) return 0;
14 for(int j=i;j<=n+1;j++) swap(g[r][j],g[cnt][j]);
15 for(int j=n+1;j>=i;j--) g[cnt][j]/=g[cnt][i];
16 for(int j=cnt+1;j<=n;j++) if(fabs(g[j][i])>1e-5)
17 for(int k=n+1;k>=i;k--) g[j][k]-=g[cnt][k]*g[j][i];
18 cnt++;
19 }
20 for(int i=n;i>=1;i--) for(int j=i+1;j<=n;j++)
21 g[i][n+1]-=g[i][j]*g[j][n+1];
22 return 1;
23 }
24 inline bool check(int ren){
25 int tmp=0;
26 //g[1][5] cos*scale
27 //g[2][5] sin*scale
28 //g[3][5] dx
29 //g[4][5] dy
30 if(fabs(p1[ren].x*g[1][5]-p1[ren].y*g[2][5]+g[3][5]-p2[ren].x)<1e-5) ++tmp;
31 if(fabs(p1[ren].x*g[2][5]+p1[ren].y*g[1][5]+g[4][5]-p2[ren].y)<1e-5) ++tmp;
32 return tmp==2;
33 }
34 namespace WSN{
35 inline short main(){srand(time(0));
36 scanf("%d",&n);
37 for(int i=1;i<=n;i++)
38 scanf("%lf%lf%lf%lf",&p1[i].x,&p1[i].y,&p2[i].x,&p2[i].y);
39 for(int w=1;w<=100;w++){
40 int ren1=rand()%n+1,ren2=rand()%n+1;
41 while(ren1==ren2){ren1=rand()%n+1;ren2=rand()%n+1;}
42 g[1][1]=p1[ren1].x,g[1][2]=-p1[ren1].y,g[1][3]=1,g[1][4]=0,g[1][5]=p2[ren1].x;
43 g[2][1]=p1[ren1].y,g[2][2]= p1[ren1].x,g[2][3]=0,g[2][4]=1,g[2][5]=p2[ren1].y;
44 g[3][1]=p1[ren2].x,g[3][2]=-p1[ren2].y,g[3][3]=1,g[3][4]=0,g[3][5]=p2[ren2].x;
45 g[4][1]=p1[ren2].y,g[4][2]= p1[ren2].x,g[4][3]=0,g[4][4]=1,g[4][5]=p2[ren2].y;
46 if(!Gauss(4)) continue;
47 int jishuqi=0;
48 for(int i=1;i<=n;i++) if(check(i)) ++jishuqi;
49 if(jishuqi>=(n+1)/2) break;
50 }
51 wsn scale=sqrt(g[1][5]*g[1][5]*1.0+g[2][5]*g[2][5]*1.0);
52 wsn arc=acos(g[1][5]/scale);
53 if(g[2][5]<0) arc=-arc;
54 printf("%.10lf\n%.10lf\n%.10lf %.10lf\n",arc,scale,g[3][5],g[4][5]);
55 return 0;
56 }
57 }
58 signed main(){return WSN::main();}

Noip模拟32(再度翻车) 2021.8.7的更多相关文章

  1. noip模拟32[好数学啊]

    noip模拟32 solutions 真是无语子,又没上100,无奈死了 虽然我每次都觉得题很难,但是还是有好多上100的 战神都200多了,好生气啊啊啊 从题开始变难之后,我的时间分配越来越不均匀, ...

  2. 2021.8.6考试总结[NOIP模拟32]

    T1 smooth 考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了. 其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的. 为了保证不重, ...

  3. Noip模拟33垫底反思 2021.8.8

    T1 Hunter 考场上没写$%p$挂了25分.也是很牛皮,以后打完过了样例一定要检查 因为样例太小了......很容易忘记%%%% 正解随便手模就出来了. 1 #include<bits/s ...

  4. NOIP模拟 32

    我在31反思中膜拜过了B哥 没想到这次又... 我给老姚家丢脸了...STO 首先T1暴力就写挂了... 贪图从$n^3$*$2^n$优化成$n^2$*$2^n$然后打错了 哗哗的扔分 而且正解都想不 ...

  5. NOIP 模拟 $32\; \rm Walker$

    题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\ ...

  6. NOIP 模拟 $32\; \rm Six$

    题解 二维状压. 第一维直接压选不同质因子的方案,第二位压方案. 分两种讨论,显然一种方案最多出现两次,否则就不合法了,所以一种是出现了一次的,另一种是出现了两次的,这样可以减小状态数. 实现可以用 ...

  7. NOIP 模拟 $32\; \rm Smooth$

    题解 \(by\;zj\varphi\) 很简单的贪心题. 开 \(B\) 个队列,每个队列存最后一次乘上的数为当前队列编号的数. 每次去所有队列中队首的最小值,不用开堆,因为开堆用于将所有数排序,但 ...

  8. noip模拟32

    \(\color{white}{\mathbb{山高而青云冷,池深而蛟穴昏,行以慎步,援以轻身,名之以:落石}}\) 开题发现 \(t1\) 80分特别好写,于是先写了 但是这个做法没有任何扩展性,导 ...

  9. noip模拟33

    \(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...

随机推荐

  1. finally方法体

    1.资源释放 java7可以在try(创建资源对象,方法体结束之后自动释放) 2.finally中有返回

  2. windows许可证更新

    slmgr /ipk 许可证 slmgr /skms  服务器(kms.xspace.in) slmgr /ato 查看许可证 slmgr /xpr

  3. ❤️❤️用最简单的方法在Webstorm中打开已存在项目 和 新建Vue项目 (亲测实用)❤️❤️

    ​ 目录 一:打开已存在项目时 二:新建一个vue项目 使用webstorm创建vue项目创建vue项目各个公司用的工具都不一样 最常见的有HBuilder X,WebStorm,Visual Stu ...

  4. [源码解析] 深度学习分布式训练框架 horovod (20) --- Elastic Training Operator

    [源码解析] 深度学习分布式训练框架 horovod (20) --- Elastic Training Operator 目录 [源码解析] 深度学习分布式训练框架 horovod (20) --- ...

  5. File Inclusion(文件包含)

    File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_ ...

  6. php_excel导出

    1.下载PHPExcel工具 2.解压后放置位置:ThinkPHP\Extend\Vendor\PHPExcel\PHPExcel.php. 3.Common.php代码 public functio ...

  7. 全面分析 Vue 的 computed 和 watch 的区别

    一.computed介绍 computed 用来监控自己定义的变量,该变量在 data 内没有声明,直接在 computed 里面定义,页面上可直接使用. //基础使用 {{msg}} <inp ...

  8. requests接口自动化-excel参数化

    在数据量大的时候,需要使用文件参数化. excel文件是其中一种. 安装xlrd读取excel文件.(这里是在pycharm安装) 发现选择豆瓣安装失败,阿里云安装成功. 准备excel文件,放在te ...

  9. Java集合框架总览

    Java集合 Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口有 3 种子类型,Lis ...

  10. 不使用插件的ajax 上传文件

    参考博主资料 我没试  我使用了带js的插件的方式 https://www.cnblogs.com/pegasus827/p/10941775.html 第一步:html   form表单代码 第二步 ...