\(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:\)

\[x^2+y^2\equiv r\mod p
\]

我们记 \(Num(r,p)\)

\[p=\prod p_i^{k_i}
\\
Num(r,p)=\prod\limits_{}^i Num(r,p_i)
\]

其实考场上靠直觉能猜到的

\(Sit_2:\)

\(r\ne 0\) 值一样,可以打个表观察一下

\[Num(r,p)=\frac{p\times p-Num(0,p)}{p-1}
\]

\(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 模拟的更多相关文章

  1. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  2. 5.30 NOI 模拟

    $5.30\ NOI $模拟 高三大哥最后一次模拟考了,祝他们好运 \(T1\)装箱游戏 显然可以将四种字母之间的空缺当做状态枚举 那么这道题就很显然了 #include<bits/stdc++ ...

  3. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  4. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  5. 5.4 NOI模拟

    \(5.4\ NOI\)模拟 \(T1\) 想到分讨,但是暴力输出一下方案之后有很多特别的情况要讨论,就弃了... 假设\(a\)是原序列,\(b\)是我们得到的序列 设\(i\)是最长公共前缀,\( ...

  6. 【2018.12.17】NOI模拟赛4

    题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...

  7. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  8. EZ 2018 06 17 NOIP2018 模拟赛(十九)

    这次的题目难得的水,但是由于许多哲学的原因,第二题题意表述很迷. 然后是真的猜题意了搞了. 不过这样都可以涨Rating我也是服了. Upt:链接莫名又消失了 A. 「NOIP2017模拟赛11.03 ...

  9. NOI 模拟赛 #2

    得分非常惨惨,半个小时写的纯暴力 70 分竟然拿了 rank 1... 如果 OYJason 和 wxjor 在可能会被爆踩吧 嘤 T1 欧拉子图 给一个无向图,如果一个边集的导出子图是一个欧拉回路, ...

随机推荐

  1. C# 通关手册(持续更新......)

    String 常用静态方法 string.Compare(string str1,string str2,bool ignoreCase) 按照字典顺序比较字符串 当str1 > str2时,返 ...

  2. Python数据分析--Numpy常用函数介绍(4)--Numpy中的线性关系和数据修剪压缩

    摘要:总结股票均线计算原理--线性关系,也是以后大数据处理的基础之一,NumPy的 linalg 包是专门用于线性代数计算的.作一个假设,就是一个价格可以根据N个之前的价格利用线性模型计算得出. 前一 ...

  3. el-form 中的数组表单验证(数组可动态添加删除)

    除了一些简单的表单验证之外,我们还会有一些稍微复杂点的多层级表单的验证,如下图所示可点击添加,删除对数组进行操作,当点击确定时需要验证每一条form-item不能为空 其tempalte部分主要代码如 ...

  4. Pandas复杂查询、数据类型转换、数据排序

    Pandas高级操作 1.复杂查询 (1)逻辑运算 以DataFrame其中一列进行逻辑计算,会产生一个对应的bool值组成的Series 于是我们可以利用返回的bool列表进行一系列的数据查询 (2 ...

  5. Istio 中实现客户端源 IP 的保持

    作者 尹烨,腾讯专家工程师, 腾讯云 TCM 产品负责人.在 K8s.Service Mesh 等方面有多年的实践经验. 导语 对于很多后端服务业务,我们都希望得到客户端源 IP.云上的负载均衡器,比 ...

  6. JavaScript之parseInt()方法

    parseInt(string, radix):用于解析一个字符串并返回指定基数的十进制整数或者NaN string参数为被解析的值,如果该值不是一个字符串,则会隐式的使用toString()方法转化 ...

  7. Linux查看系统参数配置

    Linux查看系统参数 1.查看内存(以GB为单位) [root@rac1 ~]# free -g total :内存总数,物理内存总数 used :已使用内存 free :空闲的内存数 shared ...

  8. 如何优化PlantUML流程图(时序图)

    这篇文章用来介绍,如何画出好看的流程图. 1. 选择合适的组件 1.1 plantuml官方提供的组件 1.2 加载图片 1.2.1 加载本地图片 1.2.2 加载网络图片 1.2.3 图片资源 2. ...

  9. 入坑KeePass(四)KeePass通过坚果云WebDav同步方法

    参考博客:什么值得买平台-Keepass+坚果云:多平台密码无缝同步 .1.在坚果云上创建一个同步专用的文件夹(建议勾上"默认不同步到电脑"选项) 创建之后可以把刚才创建的数据库文 ...

  10. Elasticsearch学习系列三(搜索案例实战)

    Query DSL Es提供了基于JSON的完整查询DSL(Domain Specific Language 特定域的语言)来定义查询.将查询DSL视为查询的AST(抽象语法树).它由两种子句组成: ...