6.17 NOI 模拟
\(T1\ crime\)
计算几何\(+\)最短路,我的写法很麻烦
比较无脑,直接扫一遍判断能否连接即可,需要特别判断对角线的情况
#include<bits/stdc++.h>
#define double long double
#define MAXN 200005
using namespace std;
const double g=9.80665,eps=1e-6,addx=1e-10;
int head[MAXN],nxt[MAXN<<1],to[MAXN<<1],tot;
int dis[MAXN],h[25][25];
int dx,dy,w,v,lx,ly;
void put(double x)
{
printf("%.3f\n",x);
}
bool ck(int x,int y,int xx,int yy,double Sx,double Sy,double t)
{
double Vx=Sx/t;
double Vy=(Sy+0.5*g*t*t)/t;
if(x>xx)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=x;i>xx;i--)
{
double disx=(x-i)*w*1.0+0.5*w;
double disy=disx/Sumx*Sumy;
double nowy=(y-1)*w+0.5*w+(yy>y?1:(yy==y?0:-1))*disy+addx;
int id=(ceil)(nowy/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowy)<eps)
{
zah=1.0*max({h[i][id],h[i][id-1],h[i-1][id],h[i-1][id-1]});
}
else
{
zah=1.0*max(h[i][id],h[i-1][id]);
}
if(peoh<zah) return false;
}
}
if(x<xx)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=x;i<xx;i++)
{
double disx=(i-x)*w*1.0+0.5*w;
double disy=disx/Sumx*Sumy;
double nowy=(y-1)*w+0.5*w+(yy>y?1:(yy==y?0:-1))*disy+addx;
int id=(ceil)(nowy/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowy)<eps)
{
zah=1.0*max({h[i][id],h[i][id-1],h[i+1][id],h[i+1][id-1]});
}
else
{
zah=1.0*max(h[i][id],h[i+1][id]);
}
if(peoh<zah) return false;
}
}
if(y>yy)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=y;i>yy;i--)
{
double disy=(y-i)*w*1.0+0.5*w;
double disx=(disy/Sumy)*Sumx;
double nowx=(x-1)*w+0.5*w+(xx>x?1:(xx==x?0:-1))*disx+addx;
int id=(ceil)(nowx/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowx)<eps)
{
zah=max({h[id][i],h[id-1][i],h[id][i-1],h[id-1][i-1]});
}
else
{
zah=max(h[id][i],h[id][i-1]);
}
if(peoh<zah) return false;
}
}
if(y<yy)
{
double Sumx=sqrt(1.0*abs(x-xx)*w*abs(x-xx)*w);
double Sumy=sqrt(1.0*abs(y-yy)*w*abs(y-yy)*w);
for(int i=y;i<yy;i++)
{
double disy=(i-y)*w*1.0+0.5*w;
double disx=(disy/Sumy)*Sumx;
double nowx=(x-1)*w+0.5*w+(xx>x?1:(xx==x?0:-1))*disx+addx;
int id=(ceil)(nowx/w);
double nowt=sqrt(pow(disx,2)+pow(disy,2))/Vx;
double peoh=h[x][y]+Vy*nowt-0.5*g*nowt*nowt;
double zah;
if(fabs(1.0*(id-1)*w-nowx)<eps)
{
zah=max({h[id][i],h[id-1][i],h[id][i+1],h[id-1][i+1]});
}
else
{
zah=max(h[id][i],h[id][i+1]);
}
if(peoh<zah) return false;
}
}
return true;
}
bool check(int x,int y,int xx,int yy)
{
double Sx=sqrt(pow((abs(x-xx)*w),2)+pow((abs(y-yy)*w),2));
double Sy=h[xx][yy]-h[x][y];
double det=pow(v*v-g*Sy,2)-g*g*Sy*Sy-g*g*Sx*Sx;
if(det<0) return false;
double t1=sqrt((v*v-Sy*g+sqrt(det))/(0.5*g*g));
double t2=sqrt((v*v-Sy*g-sqrt(det))/(0.5*g*g));
return ck(x,y,xx,yy,Sx,Sy,t1)|ck(x,y,xx,yy,Sx,Sy,t2);
}
int id(int x,int y)
{
return (x-1)*dy+y;
}
void add(int u,int v)
{
tot++;
to[tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void bfs()
{
queue<int>q;
memset(dis,-1,sizeof(dis));
q.push(id(lx,ly));
dis[id(lx,ly)]=0;
while(q.size())
{
int now=q.front();
q.pop();
for(int i=head[now];i;i=nxt[i])
{
int y=to[i];
if(dis[y]==-1)
{
dis[y]=dis[now]+1;
q.push(y);
}
}
}
}
int main()
{
scanf("%d%d%d%d%d%d",&dx,&dy,&w,&v,&lx,&ly);
for(int i=1;i<=dy;i++)
{
for(int j=1;j<=dx;j++)
{
scanf("%d",&h[j][i]);
}
}
for(int i=1;i<=dy;i++)
{
for(int j=1;j<=dx;j++)
{
for(int i1=1;i1<=dy;i1++)
{
for(int j1=1;j1<=dx;j1++)
{
if(i==i1&&j==j1) continue;
if(check(j,i,j1,i1))
{
add(id(j,i),id(j1,i1));
}
}
}
}
}
bfs();
for(int i=1;i<=dy;i++)
{
for(int j=1;j<=dx;j++)
{
if(dis[id(j,i)]==-1) cout<<"X ";
else cout<<dis[id(j,i)]<<" ";
}
cout<<"\n";
}
}
\(T2\ circle\)
猜结论的二次剩余题 \(kill\ me\)
这道题是一个纯纯的结论题
\(bz\)掏出了三个结论:
\(Sit_1:\)
\]
我们记 \(Num(r,p)\)
\\
Num(r,p)=\prod\limits_{}^i Num(r,p_i)
\]
其实考场上靠直觉能猜到的
\(Sit_2:\)
\(r\ne 0\) 值一样,可以打个表观察一下
\]
\(Sit_3:\)
如果 \(-1\) 有在\(\mod p\)二次剩余 \(Num(0,p)=2\times p-1\)
否则 \(Num(0,p)=1\)
一般这种结论题代码都比较简单了
#include<bits/stdc++.h>
#define int long long
#define MAXN 10000005
using namespace std;
int pri[MAXN+5],val[MAXN+5],Mp[MAXN+5],cnt,p,r;
bool vis[MAXN+5];
int my_pow(int a,int b,int p)
{
int res=1;
while(b)
{
if(b&1)
{
res=(res*a)%p;
}
a=(a*a)%p;
b>>=1;
}
return res;
}
void Init()
{
for(int i=2;i<=MAXN;i++)
{
if(!vis[i])
{
pri[++cnt]=i;
if(my_pow(i-1,(i-1)/2,i)==1) val[i]=(2*i-1);
else val[i]=1;
Mp[i]=i;
}
for(int j=1;j<=cnt&&i*pri[j]<=MAXN;j++)
{
vis[i*pri[j]]=true;
Mp[i*pri[j]]=max(Mp[i],pri[j]);
if(i%pri[j]==0) break;
}
}
}
int Num(int r,int p)
{
if(r==0) return val[p];
return (p*p-val[p])/(p-1);
}
// 1 5 0
int dfs(int now)
{
if(now==1) return 1;
int x=now,pr=Mp[now];
while(x%pr==0) x/=pr;
return Num(r%Mp[now],Mp[now])*dfs(x);
}
void sol()
{
scanf("%lld%lld",&p,&r);
cout<<dfs(p)<<"\n";
}
int T;
signed main()
{
scanf("%lld",&T);
Init();
while(T--) sol();
}
\(T3\ crystal\)
和曾经的一道\(CF\)的题有点像
\(\mod 998244353\) 其实感觉像是在提示误导 \(FWT\)
\(a\oplus b=c,a\oplus c=b1\)
我们前\(n-1\)个数任选都不能大于最后选的数的 \(m\) 的话,就可以直接乘法原理了
这就和 \(CF\) 那道题先解除一些数位的限制一样。
考虑,枚举 \(a_p\) 和 \(m_p\) 的最短 \(LCP\), 然后我们这个数系数为 \(1\),其余的数系数相乘即可
具体的,我们只需要让第 \(i\) 位是 \(0\),并且有一个位置 \(p\),\(a_p\) 的第 \(i\) 位是 \(1\) 就可以统计答案了
\(dp[j][k][l]\) 表示第 \(j\) 个数,第 \(i\) 位异或起来为 \(k\) ,有没有钦定 \(p\) 的方案数
考虑 \(m_j\) 第 \(i\) 位为 \(1\),\(a_j\) 可以选 \(0/1\),选 \(0\) 的话贡献的系数是 \(2^i\) ,选 \(1\) 贡献的系数是 \(m\& (2^i-1)+1\),如果确定这一位的话,系数是 \(1\)
#include<bits/stdc++.h>
#define ull unsigned long long
#define int long long
#define MAXN 200005
using namespace std;
const int mod=998244353;
int n,Ans,dat[MAXN];
int dp[2][2][2];
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&dat[i]);
Ans^=dat[i];
}
Ans=!Ans;
int Xor=0;
for(int i=31;i>=0;i--)
{
memset(dp,0,sizeof(dp));
dp[0][0][0]=1;
for(int j=1;j<=n;j++)
{
int now=(j&1);
int pre=(now^1);
Xor^=(dat[j]>>(i+1));
if(dat[j]>>i&1)
{
for(int k=0;k<=1;k++)
{
for(int l=0;l<=1;l++)
{
(dp[now][k^1][l]=dp[pre][k][l]*((dat[j]&(1<<i)-1)+1)%mod)%=mod;
}
}
for(int k=0;k<=1;k++)
{
(dp[now][k][1]+=dp[pre][k][0]+(ull)(dp[pre][k][1]<<i)%mod)%=mod;
}
}
else
{
for(int k=0;k<=1;k++)
{
for(int l=0;l<=1;l++)
{
(dp[now][k][l]=dp[pre][k][l]*((dat[j]&(1<<i)-1)+1)%mod)%=mod;
}
}
}
}
if(Xor) continue;
//3 1 2 3
Ans=(Ans+dp[n&1][0][1])%mod;
}
cout<<Ans<<"\n";
}
6.17 NOI 模拟的更多相关文章
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- 5.30 NOI 模拟
$5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 5.4 NOI模拟
\(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...
- 【2018.12.17】NOI模拟赛4
题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- EZ 2018 06 17 NOIP2018 模拟赛(十九)
这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...
- NOI 模拟赛 #2
得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...
随机推荐
- 3.0 vue以构造函数形式返回数据
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 以圆类 Circle 为基础设计球类 Sphere
学习内容:实验二以圆类 Circle 为基础设计球类 Sphere 代码示例: import java.util.Scanner; class Point{ private double x; pri ...
- 一文讲透为Power Automate for Desktop (PAD) 实现自定义模块 - 附完整代码
概述 Power Automate for Desktop (以下简称PAD)是微软推出的一款针对Windows桌面端的免费RPA(机器人流程自动化)工具,它目前默认会随着Windows 11安装,但 ...
- MySQL - 数据库设计步骤
需求分析:分析用户的需求,包括数据.功能和性能需求. 概念结构设计:主要采用E-R模型进行设计,包括画E-R图. 逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换,进行关系规范化 ...
- Redis - Redlock算法
Redis - Redlock算法 在Redis的分布式环境中,我们假设有N个Redis master.这些节点完全互相独立,不存在主从复制或者其他集群协调机制.之前我们已经描述了在Redis单实例下 ...
- OAuth2学习中的一些高频问题的QA
关于OAuth2相信很多初学者都有一些疑问,胖哥将这些疑问一一收集了起来做成了QA,或许能帮助学习者. OAuth2相关的QA Q:OAuth2 的一些常用场景? A: OAuth2主要用于API授权 ...
- 从局部信息推测基恩士的Removing BackGround Information算法的实现。
最近从一个朋友那里看到了一些基恩士的资料,本来是想看下那个比较有特色的浓淡补正滤波器的(因为名字叫Shading Correction Filter,翻译过来的意思有点搞笑),不过看到起相关文档的附近 ...
- 关于vue项目中axios跨域的解决方法(开发环境)
1.在config文件中修改index.js proxyTable: { "/api":{ target: 'https://www.baidu.com/muc/',//你需要跨域 ...
- Rabbimtq消息传递对象
对象序列化即可.
- NC16597 [NOIP2011]聪明的质监员
NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...