前言

踩了挺多以前没踩过的坑。。。

T1 一开始是打了一个 60pts 的 DFS ,在与暴力拍了几组数据保证正确性之后,

突然想到 BFS 可能会更快一些,然后就又码了一个 BFS,又和 DFS 拍了200组数据,

发现 BFS 确实快,然后就交了一个 BFS 然后我就直接 \(60pts\rightarrow 0pts\)

后来看了一下特殊性质该了一下边界就 80pts了,肝疼QAQ

然后就是 T3 以前一直是在 结构体里读入的,这回就翻车了。

还有就是 map 的重载小于号最好不要和等于号一样,不然就挂分了。。

T1 Smooth

解题思路

官方题解说和蚯蚓有一点像(尽管我没有做过这个题)

其实就是开了 b 个队列,每次选择所有队首元素中最小的就是光滑数。

然后对于编号大于等于刚才所选队列的加入一个新元素就好了。

因为每次都是从小到大,因此可以达到不重复的目的。

code

80pts

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Pass"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;
  9. char ch=getchar();
  10. while(ch>'9'||ch<'0')
  11. {
  12. if(ch=='-') f=-1;
  13. ch=getchar();
  14. }
  15. while(ch>='0'&&ch<='9')
  16. {
  17. x=(x<<1)+(x<<3)+(ch^48);
  18. ch=getchar();
  19. }
  20. return x*f;
  21. }
  22. const int N=7e7+10,M=1e7;
  23. int INF;
  24. int k,b,ans,pb[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
  25. set<int> s;
  26. void dfs(int x,int cnt)
  27. {
  28. if(cnt>INF||cnt<0) return ;
  29. if(x==b+1)
  30. {
  31. s.insert(cnt);
  32. if(s.size()>k) s.erase((--s.end()));
  33. return ;
  34. }
  35. int pre=cnt;
  36. for(int i=1;cnt<=INF&&cnt>0;i++)
  37. {
  38. dfs(x+1,cnt);
  39. cnt=cnt*pb[x];
  40. }
  41. }
  42. signed main()
  43. {
  44. b=read();
  45. k=read();
  46. if(b==2) INF=1e18;
  47. else INF=7e7;
  48. dfs(1,1);
  49. printf("%lld",(*s.rbegin()));
  50. return 0;
  51. }

正解

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Pass"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;
  9. char ch=getchar();
  10. while(ch>'9'||ch<'0')
  11. {
  12. if(ch=='-') f=-1;
  13. ch=getchar();
  14. }
  15. while(ch>='0'&&ch<='9')
  16. {
  17. x=(x<<1)+(x<<3)+(ch^48);
  18. ch=getchar();
  19. }
  20. return x*f;
  21. }
  22. const int INF=1e18;
  23. queue<int> q[20];
  24. int k,ans,b,pb[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
  25. signed main()
  26. {
  27. b=read();
  28. k=read();
  29. for(int i=1;i<=b;i++)
  30. q[i].push(pb[i]);
  31. while(k!=1)
  32. {
  33. int minn=INF,id;
  34. for(int i=1;i<=b;i++)
  35. if(minn>q[i].front())
  36. {
  37. minn=q[i].front();
  38. id=i;
  39. }
  40. q[id].pop();
  41. ans=minn;
  42. for(int i=id;i<=b;i++)
  43. q[i].push(ans*pb[i]);
  44. k--;
  45. }
  46. printf("%lld",ans);
  47. return 0;
  48. }

T2 Six

解题思路

挺好的一个题,主要有两种做法:状压,状压+记忆化DFS

我当然是选择裸的状压了(雾

首先不难发现我们只关心 n 的质因数的种类和数量,因此不需要记录对应的数值。

发现对于所含质因数种类相同的两个数在某种意义上是等价的。

因此我们可以将此压缩成为一类数,记录这一类数的数量就好了。

然后就可以愉快的状压了。

采用 8 进制进行记录,0 表示没有出现过这个质因数

1~6 表示与此数同时计入中编号最小的数的编号

7则表示这个数字出现过两次。

然后就是状压,并对于已经有的状态的基础上进行 DP 就好了。

code

48pts DFS

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Pass"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;
  9. char ch=getchar();
  10. while(ch>'9'||ch<'0')
  11. {
  12. if(ch=='-') f=-1;
  13. ch=getchar();
  14. }
  15. while(ch>='0'&&ch<='9')
  16. {
  17. x=(x<<1)+(x<<3)+(ch^48);
  18. ch=getchar();
  19. }
  20. return x*f;
  21. }
  22. const int N=4e7+10,mod=1e9+7;
  23. int n,ans,num[N],t,tot,p[10],q[10],s[N];
  24. int cnt,pri[N];
  25. bool vis[N];
  26. void Prime()
  27. {
  28. vis[1]=true;
  29. for(int i=2;i<=min((int)sqrt(n)+1,40000000ll);i++)
  30. {
  31. if(!vis[i]) pri[++cnt]=i;
  32. for(int j=1;j<=cnt&&i*pri[j]<=min((int)sqrt(n)+1,40000000ll);j++)
  33. {
  34. vis[i*pri[j]]=true;
  35. if(i%pri[j]==0) break;
  36. }
  37. }
  38. }
  39. void dfs(int x,int all)
  40. {
  41. if(x==tot+1)
  42. {
  43. if(all!=1) num[++t]=all;
  44. return ;
  45. }
  46. dfs(x+1,all);
  47. for(int i=1;i<=q[x];i++)
  48. {
  49. all*=p[x];
  50. dfs(x+1,all);
  51. }
  52. }
  53. int gcd(int x,int y)
  54. {
  55. if(!y) return x;
  56. return gcd(y,x%y);
  57. }
  58. void dfs2(int pos)
  59. {
  60. ans=(ans+1)%mod;
  61. for(int i=1;i<=t;i++)
  62. {
  63. int sum=0;
  64. for(int j=1;j<pos&&sum<=1;j++)
  65. if(gcd(s[j],num[i])!=1)
  66. sum++;
  67. if(sum<=1)
  68. {
  69. s[pos]=num[i];
  70. dfs2(pos+1);
  71. }
  72. }
  73. }
  74. signed main()
  75. {
  76. n=read();
  77. Prime();
  78. for(int i=1;i<=cnt&&n!=1;i++)
  79. {
  80. if(n%pri[i]) continue;
  81. p[++tot]=pri[i];
  82. while(n%pri[i]==0)
  83. {
  84. q[tot]++;
  85. n/=pri[i];
  86. }
  87. }
  88. if(n!=1) p[++tot]=n,q[tot]=1;
  89. dfs(1,1);
  90. dfs2(1);
  91. printf("%lld",ans-1);
  92. return 0;
  93. }

正解

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define ull unsigned long long
  4. #define f() cout<<"Pass"<<endl
  5. using namespace std;
  6. inline int read()
  7. {
  8. int x=0,f=1;
  9. char ch=getchar();
  10. while(ch>'9'||ch<'0')
  11. {
  12. if(ch=='-') f=-1;
  13. ch=getchar();
  14. }
  15. while(ch>='0'&&ch<='9')
  16. {
  17. x=(x<<1)+(x<<3)+(ch^48);
  18. ch=getchar();
  19. }
  20. return x*f;
  21. }
  22. const int N=(1<<18)+10,M=(1<<6)+10,mod=1e9+7;
  23. int n,cnt,ans,f[N],s[N],fac[10],sub[M];
  24. signed main()
  25. {
  26. n=read();
  27. for(int i=2;i<=sqrt(n)+1;i++)
  28. if(n%i==0)
  29. {
  30. cnt++;
  31. while(n%i==0)
  32. {
  33. fac[cnt]++;
  34. n/=i;
  35. }
  36. }
  37. if(n!=1) fac[++cnt]=1;
  38. fill(sub+1,sub+(1<<cnt)+1,1);
  39. for(int i=1;i<(1<<cnt);i++)
  40. for(int j=1;j<=cnt;j++)
  41. if((i>>j-1)&1)
  42. sub[i]*=fac[j];
  43. f[0]=1;
  44. for(int i=0;i<(1<<3*cnt);i++)
  45. if(f[i])
  46. for(int j=1;j<(1<<cnt);j++)
  47. {
  48. int pos=0,sta=i,jud=0;
  49. bool check=false;
  50. for(int k=1;k<=cnt;k++)
  51. if(!((i>>(k-1)*3)&7)&&((j>>k-1)&1))
  52. {
  53. pos=k;
  54. break;
  55. }
  56. for(int k=1;k<=cnt;k++)
  57. if(((i>>(k-1)*3)&7)&&((j>>k-1)&1))
  58. {
  59. if(((i>>(k-1)*3)&7)==7||(jud&&jud!=((i>>(k-1)*3)&7)))
  60. {
  61. check=true;
  62. break;
  63. }
  64. if(!jud) jud=((i>>(k-1)*3)&7);
  65. }
  66. if(check) continue;
  67. for(int k=1;k<=cnt;k++)
  68. if((j>>k-1)&1)
  69. {
  70. if((i>>(k-1)*3)&7) sta|=7<<(k-1)*3;
  71. else sta|=pos<<(k-1)*3;
  72. }
  73. f[sta]=(f[sta]+f[i]*sub[j]%mod)%mod;
  74. }
  75. for(int i=1;i<(1<<3*cnt);i++)
  76. ans=(ans+f[i])%mod;
  77. printf("%lld",ans);
  78. return 0;
  79. }

T3 Walker

解题思路

随机化算法是正解还是第一次见。

随便挑出两组数,然后高斯消元求出来三个操作的数。

然后进行回代看是否有一半以上的数满足条件。

有一个小细节:对于 \([-\dfrac{\pi}{2},\dfrac{\pi}{2}]\)类似的区间里

不同的弧度的 cos 值是相同的,这个时候就需要用 sin 来判断一下了。

code

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. const int N=1e5+10;int n;
  5. double eps=1e-6,s[10][10];
  6. struct node
  7. {
  8. double x,y,x2,y2,x3,y3;
  9. }q[N];
  10. int random(int l,int r)
  11. {
  12. int x=rand()*rand()%(r-l+1)+l;
  13. while(x<=0) x=rand()*rand()%(r-l+1)+l;
  14. return x;
  15. }
  16. void gaosi(int n,int m)
  17. {
  18. for(int i=1;i<=n;i++)
  19. {
  20. int pos=0;
  21. for(int j=1;j<m;j++) if(s[i][j]){pos=j;break;}
  22. if(s[i][pos]!=1&&s[i][pos])
  23. {
  24. double temp=s[i][pos];
  25. for(int j=pos;j<=m;j++) s[i][j]/=temp;
  26. }
  27. for(int j=i+1;j<=n;j++)
  28. {
  29. if(!s[j][pos]) continue;
  30. double temp=s[j][pos];
  31. for(int k=pos;k<=m;k++) s[j][k]-=s[i][k]*temp;
  32. }
  33. }
  34. for(int i=n;i>=2;i--)
  35. {
  36. int pos=0;
  37. for(int j=1;j<m;j++) if(s[i][j]){pos=j;break;}
  38. if(s[i][pos]!=1&&s[i][pos])
  39. {
  40. double temp=s[i][pos];
  41. for(int j=pos;j<=m;j++) s[i][j]/=temp;
  42. }
  43. for(int j=1;j<i;j++)
  44. {
  45. if(!s[j][pos]) continue;
  46. double temp=s[j][pos];
  47. for(int k=pos;k<=m;k++) s[j][k]-=s[i][k]*temp;
  48. }
  49. }
  50. }
  51. signed main()
  52. {
  53. srand((unsigned)time(0)); scanf("%lld",&n);
  54. for(int i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&q[i].x,&q[i].y,&q[i].x2,&q[i].y2);
  55. while(1)
  56. {
  57. int i=random(1,n),j=random(1,n),sum=0;
  58. if(i==j) continue;
  59. s[1][1]=q[i].x;s[1][2]=-q[i].y;s[1][3]=1;s[1][4]=0;s[1][5]=q[i].x2;
  60. s[2][1]=q[i].y;s[2][2]=q[i].x;s[2][3]=0;s[2][4]=1;s[2][5]=q[i].y2;
  61. s[3][1]=q[j].x;s[3][2]=-q[j].y;s[3][3]=1;s[3][4]=0;s[3][5]=q[j].x2;
  62. s[4][1]=q[j].y;s[4][2]=q[j].x;s[4][3]=0;s[4][4]=1;s[4][5]=q[j].y2;
  63. gaosi(4,5);
  64. double cs,ss,scal,dx,dy,cos,sin,tmp=1;
  65. for(int k=1;k<=4;k++) if(fabs(s[k][1])>eps) cs=s[k][5];
  66. for(int k=1;k<=4;k++) if(fabs(s[k][2])>eps) ss=s[k][5];
  67. for(int k=1;k<=4;k++) if(fabs(s[k][3])>eps) dx=s[k][5];
  68. for(int k=1;k<=4;k++) if(fabs(s[k][4])>eps) dy=s[k][5];
  69. scal=sqrt(cs*cs+ss*ss);cos=cs/scal;sin=ss/scal;
  70. if(sin<0) tmp=-1;
  71. for(int k=1;k<=n;k++) if(fabs((q[k].x*cos-q[k].y*sin)*scal+dx-q[k].x2)<=eps&&fabs((q[k].y*cos+q[k].x*sin)*scal+dy-q[k].y2)<=eps) sum++;
  72. if(sum>=(n>>1)){printf("%.11lf\n%.11lf\n%.11lf %.11lf",acos(cos)*tmp,scal,dx,dy);return 0;}
  73. }
  74. return 0;
  75. }

8.7考试总结(NOIP模拟)[Smooth·Six·Walker]的更多相关文章

  1. 6.17考试总结(NOIP模拟8)[星际旅行·砍树·超级树·求和]

    6.17考试总结(NOIP模拟8) 背景 考得不咋样,有一个非常遗憾的地方:最后一题少取膜了,\(100pts->40pts\),改了这么多年的错还是头一回看见以下的情景... T1星际旅行 前 ...

  2. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  3. 5.22考试总结(NOIP模拟1)

    5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...

  4. [考试总结]noip模拟23

    因为考试过多,所以学校的博客就暂时咕掉了,放到家里来写 不过话说,vscode的markdown编辑器还是真的很好用 先把 \(noip\) 模拟 \(23\) 的总结写了吧.. 俗话说:" ...

  5. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  6. 「考试」noip模拟9,11,13

    9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...

  7. 6.11考试总结(NOIP模拟7)

    背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...

  8. 6.10考试总结(NOIP模拟6)

    前言 就这题考的不咋样果然还挺难改的.. T1 辣鸡 前言 我做梦都没想到这题正解是模拟,打模拟赛的时候看错题面以为是\(n\times n\)的矩阵,喜提0pts. 解题思路 氢键的数量计算起来无非 ...

  9. 6.7考试总结(NOIP模拟5)

    前言 昨天说好不考试来着,昨晚就晚睡颓了一会,今天遭报应了,也没好好考,考得挺烂的就不多说了. T1 string 解题思路 比赛上第一想法就是打一发sort,直接暴力,然后完美TLE40pts,这一 ...

随机推荐

  1. VLAN的基础介绍与使用方法

    一.VLAN概述与优势 二.VLAN的种类 三.VLAN的范围 四.VLAN的三种接口模式 五.VLAN的实例操作 一.VLAN概述与优势 VLAN(虚拟局域网)通过为子网提供数据链路连接来抽象出局域 ...

  2. 一篇技术博文引发的stylelint项目实践

    背景 看到项目中团队成员写CSS样式风格迥异,CSS样式的书写顺序没有鲜明的规范.想到以前看过CSS样式书写顺序的文章,决定找出来,给团队成员科普一下.查阅了好几篇文章,觉得这篇文章给出的理由最硬核, ...

  3. zbxtable的使用

    实验环境: zabbix server 172.16.1.121 mysql 172.16.1.121 访问端 172.16.1.122 54.1 zbxtable 1 说明 ZbxTable使用Go ...

  4. 17、ansible配置管理

    17.1.前言: 1.说明: ansible是自动化运维工具,基于Python开发,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力,真正 ...

  5. webpack(2)webpack核心概念

    前言   本质上,webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具.当 webpack 处理应用程序时,它会在内部构建一个 依赖图(dependency graph) ...

  6. iOS导入其他APP下载的文件(用其他应用打开)

    今天给自己的APP新增了一个小功能 可以打开iOS其他APPTXT 文件,一个很小的功能,做阅读APP的小伙伴不要错过. 附上APP地址: 一阅阅读 有想看小说的小伙伴可以试下 支持换源 支持自定义书 ...

  7. Java中有趣的移位操作!彻底弄懂各个移位操作符的使用方式

    << <<: 左移运算,左移几位就补几个0 >> >>: 右移运算,为算术右移 如果数字为正数时,移位后在前面补0 如果数字为负数时,移位后在前面补1 ...

  8. Ha1cyon-CTF 芜湖

    感觉自己还是很欠缺的,尤其是C++的逆向,对stl的不熟悉,直接误导我静态分析了...然后这种题和平常不同的是没有任何混淆和flag验证,需要的是耐心的分析,在过程中,找到线索,这题还考了base64 ...

  9. Linux | 搜索命令

    grep grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式:grep[选项][文本] grep命令的参数及其作用 参数 作用 -b 将可执行文件当作文本文件对待 -c 公显示找到的行数 ...

  10. 关于java异常处理的思考

    学习java的过程中,初学者更多的是为了实验而写代码,而不考虑实际情况中的人机交互过程中的一些问题. 在java项目中,更多的用户不会因为你给了某些限制提醒,他就一定会按照你所给的提示来输入或者操作, ...