前言

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

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

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

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

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

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

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

T1 Smooth

解题思路

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

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

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

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

code

80pts

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=7e7+10,M=1e7;
int INF;
int k,b,ans,pb[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
set<int> s;
void dfs(int x,int cnt)
{
if(cnt>INF||cnt<0) return ;
if(x==b+1)
{
s.insert(cnt);
if(s.size()>k) s.erase((--s.end()));
return ;
}
int pre=cnt;
for(int i=1;cnt<=INF&&cnt>0;i++)
{
dfs(x+1,cnt);
cnt=cnt*pb[x];
}
}
signed main()
{
b=read();
k=read();
if(b==2) INF=1e18;
else INF=7e7;
dfs(1,1);
printf("%lld",(*s.rbegin()));
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int INF=1e18;
queue<int> q[20];
int k,ans,b,pb[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
signed main()
{
b=read();
k=read();
for(int i=1;i<=b;i++)
q[i].push(pb[i]);
while(k!=1)
{
int minn=INF,id;
for(int i=1;i<=b;i++)
if(minn>q[i].front())
{
minn=q[i].front();
id=i;
}
q[id].pop();
ans=minn;
for(int i=id;i<=b;i++)
q[i].push(ans*pb[i]);
k--;
}
printf("%lld",ans);
return 0;
}

T2 Six

解题思路

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

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

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

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

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

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

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

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

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

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

code

48pts DFS

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=4e7+10,mod=1e9+7;
int n,ans,num[N],t,tot,p[10],q[10],s[N];
int cnt,pri[N];
bool vis[N];
void Prime()
{
vis[1]=true;
for(int i=2;i<=min((int)sqrt(n)+1,40000000ll);i++)
{
if(!vis[i]) pri[++cnt]=i;
for(int j=1;j<=cnt&&i*pri[j]<=min((int)sqrt(n)+1,40000000ll);j++)
{
vis[i*pri[j]]=true;
if(i%pri[j]==0) break;
}
}
}
void dfs(int x,int all)
{
if(x==tot+1)
{
if(all!=1) num[++t]=all;
return ;
}
dfs(x+1,all);
for(int i=1;i<=q[x];i++)
{
all*=p[x];
dfs(x+1,all);
}
}
int gcd(int x,int y)
{
if(!y) return x;
return gcd(y,x%y);
}
void dfs2(int pos)
{
ans=(ans+1)%mod;
for(int i=1;i<=t;i++)
{
int sum=0;
for(int j=1;j<pos&&sum<=1;j++)
if(gcd(s[j],num[i])!=1)
sum++;
if(sum<=1)
{
s[pos]=num[i];
dfs2(pos+1);
}
}
}
signed main()
{
n=read();
Prime();
for(int i=1;i<=cnt&&n!=1;i++)
{
if(n%pri[i]) continue;
p[++tot]=pri[i];
while(n%pri[i]==0)
{
q[tot]++;
n/=pri[i];
}
}
if(n!=1) p[++tot]=n,q[tot]=1;
dfs(1,1);
dfs2(1);
printf("%lld",ans-1);
return 0;
}

正解

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
const int N=(1<<18)+10,M=(1<<6)+10,mod=1e9+7;
int n,cnt,ans,f[N],s[N],fac[10],sub[M];
signed main()
{
n=read();
for(int i=2;i<=sqrt(n)+1;i++)
if(n%i==0)
{
cnt++;
while(n%i==0)
{
fac[cnt]++;
n/=i;
}
}
if(n!=1) fac[++cnt]=1;
fill(sub+1,sub+(1<<cnt)+1,1);
for(int i=1;i<(1<<cnt);i++)
for(int j=1;j<=cnt;j++)
if((i>>j-1)&1)
sub[i]*=fac[j];
f[0]=1;
for(int i=0;i<(1<<3*cnt);i++)
if(f[i])
for(int j=1;j<(1<<cnt);j++)
{
int pos=0,sta=i,jud=0;
bool check=false;
for(int k=1;k<=cnt;k++)
if(!((i>>(k-1)*3)&7)&&((j>>k-1)&1))
{
pos=k;
break;
}
for(int k=1;k<=cnt;k++)
if(((i>>(k-1)*3)&7)&&((j>>k-1)&1))
{
if(((i>>(k-1)*3)&7)==7||(jud&&jud!=((i>>(k-1)*3)&7)))
{
check=true;
break;
}
if(!jud) jud=((i>>(k-1)*3)&7);
}
if(check) continue;
for(int k=1;k<=cnt;k++)
if((j>>k-1)&1)
{
if((i>>(k-1)*3)&7) sta|=7<<(k-1)*3;
else sta|=pos<<(k-1)*3;
}
f[sta]=(f[sta]+f[i]*sub[j]%mod)%mod;
}
for(int i=1;i<(1<<3*cnt);i++)
ans=(ans+f[i])%mod;
printf("%lld",ans);
return 0;
}

T3 Walker

解题思路

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

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

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

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

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

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;int n;
double eps=1e-6,s[10][10];
struct node
{
double x,y,x2,y2,x3,y3;
}q[N];
int random(int l,int r)
{
int x=rand()*rand()%(r-l+1)+l;
while(x<=0) x=rand()*rand()%(r-l+1)+l;
return x;
}
void gaosi(int n,int m)
{
for(int i=1;i<=n;i++)
{
int pos=0;
for(int j=1;j<m;j++) if(s[i][j]){pos=j;break;}
if(s[i][pos]!=1&&s[i][pos])
{
double temp=s[i][pos];
for(int j=pos;j<=m;j++) s[i][j]/=temp;
}
for(int j=i+1;j<=n;j++)
{
if(!s[j][pos]) continue;
double temp=s[j][pos];
for(int k=pos;k<=m;k++) s[j][k]-=s[i][k]*temp;
}
}
for(int i=n;i>=2;i--)
{
int pos=0;
for(int j=1;j<m;j++) if(s[i][j]){pos=j;break;}
if(s[i][pos]!=1&&s[i][pos])
{
double temp=s[i][pos];
for(int j=pos;j<=m;j++) s[i][j]/=temp;
}
for(int j=1;j<i;j++)
{
if(!s[j][pos]) continue;
double temp=s[j][pos];
for(int k=pos;k<=m;k++) s[j][k]-=s[i][k]*temp;
}
}
}
signed main()
{
srand((unsigned)time(0)); scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&q[i].x,&q[i].y,&q[i].x2,&q[i].y2);
while(1)
{
int i=random(1,n),j=random(1,n),sum=0;
if(i==j) continue;
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;
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;
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;
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;
gaosi(4,5);
double cs,ss,scal,dx,dy,cos,sin,tmp=1;
for(int k=1;k<=4;k++) if(fabs(s[k][1])>eps) cs=s[k][5];
for(int k=1;k<=4;k++) if(fabs(s[k][2])>eps) ss=s[k][5];
for(int k=1;k<=4;k++) if(fabs(s[k][3])>eps) dx=s[k][5];
for(int k=1;k<=4;k++) if(fabs(s[k][4])>eps) dy=s[k][5];
scal=sqrt(cs*cs+ss*ss);cos=cs/scal;sin=ss/scal;
if(sin<0) tmp=-1;
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++;
if(sum>=(n>>1)){printf("%.11lf\n%.11lf\n%.11lf %.11lf",acos(cos)*tmp,scal,dx,dy);return 0;}
}
return 0;
}

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. Visual Studio 2019 v16.10 和 v16.11 Preview 1 现已推出!

    Visual Studio 2019 v16.10有什么新功能? 我们很高兴地宣布Visual Studio 2019 v16.10 GA 和 v16.11 preview 1发布.此版本使我们的主题 ...

  2. 在vue中下拉框切换事件中改新建表单中的一个值,页面不显示

    事件中改新建表单中的一个值,页面不显示,当另一个对象值发生改变时,这个页面上的值才会显示 由于新建表单是弹窗,在弹出时会重新给每个字段重新赋值,在赋值时没给这个字段赋值(常见新加功能时,加了一个字段, ...

  3. 五、JavaSE语言基础之流程控制

    流程控制的简单概念 流程控制:指通过关键字控制代码的执行流程; 一.顺序结构:执行顺序从左到右从上到下; 顺序结构无关键字,一般而言大多数代码都是顺序结构; 二.选择结构:根据条件判断是否执行 选择结 ...

  4. 通过xrdp连接centos7桌面:

    6.1.需求场景: 1.希望使用windows远程访问centos图形界面,使用xmanager连接centos远程桌面时有以下问题: (1)只能有一个用户同时使用xmanger连接远程桌面,多个用户 ...

  5. SonarQube集成Gitlab

    SonarQube配置gitlab Gitlab创建访问Token 拷贝此Token至Sonarqube进行配置 检查配置配置成功 可以看到权限内的项目

  6. SpringBoot集成websocket发送后台日志到前台页面

    业务需求 后台为一个采集系统,需要将采集过程中产生的日志实时发送到前台页面展示,以便了解采集过程. 技能点 SpringBoot 2.x websocket logback thymeleaf Rab ...

  7. centos 安装es

    第一步:必须要有jre支持 elasticsearch是用Java实现的,跑elasticsearch必须要有jre支持,所以必须先安装jre 第二步:下载elasticsearch 进入官方下载 h ...

  8. PHP单例模式 (转)

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...

  9. 每日单词 —— cut to the chase

    cut to the chase: 词面意思--切奶酪 是美国俚语--开门见山:直奔主题 看一看相关的例句或者电影读白吧! 1. - 嫌疑人:Shall we cut to the chase ? 侦 ...

  10. C语言:带参数的宏与函数的区别

    带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算:宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存.而函数是一段可以重复使用的代码,会被编译,会给它 ...