\(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. 299. Bulls and Cows - LeetCode

    Question 299. Bulls and Cows Solution 题目大意:有一串隐藏的号码,另一个人会猜一串号码(数目相同),如果号码数字与位置都对了,给一个bull,数字对但位置不对给一 ...

  2. 101_Power Pivot DAX 累计至今,历史累计至今

    焦棚子的文章目录 一.背景 DAX中已经有诸如YTD,QTD,MTD时间智能函数.用起来也比较方便. 但很多时候需要看历史累计至今的数据,需要自己根据实际情况写dax. 今天抛砖引玉,写一个示例. 二 ...

  3. Hadoop安装学习(第二天)

    学习任务: 1.对VMnet8进行设置 2.配置主机名,对host文件进行编辑 3.将Hadoop文件以及jdk通过Xshell7传输到Linux系统 4.设置免密登录

  4. 免申请直接用上 IDEA 新 UI,只需要这三步配置

    早上给大家介绍了IDEA官方宣布正在开发一套全新的UI,但目前是预览版需要申请才能体验. 随后马上就有网友分享了,不需要申请直接就能激活体验的方法. 本期视频:https://www.bilibili ...

  5. 移动云使用 JuiceFS 支持 Apache HBase 增效降本的探索

    作者简介: 陈海峰,移动云数据库 Apache HBase 开发人员,对 Apache HBase.RBF.Apache Spark 有浓厚兴趣. 背景 Apache HBase 是 Apache H ...

  6. MySQL数据库3

    内容概要 自增特性 约束条件之外键 外键简介 外键关系 外键SQL语句之一对多关系 外键SQL语句之多对多关系 外键SQL语句之一对一关系 查询关键字 数据准备 查询关键字之select与from 查 ...

  7. Java泛型知识总结

    泛型 前言 在没有泛型之前,程序员必须使用Object编写适用于多种类型的代码.很繁琐,也不安全. 泛型的引入使Java有了一个很强的类型系统,允许设计者详细地描述变量和方法的类型要如何变化. 在普通 ...

  8. Linux常用操作:文件及文件夹

    一.创建 (1)mkdir 创建一个目录 (2)touch 创建一个空文件 注:-r 表示递归操作 二.删除 rm 删除文件 rm -r 删除目录 rm -r * 删除目录下的所有文件 注:-f 不用 ...

  9. zabbix监控钉钉报警

    1. bash脚本 #!/bin/bash to=$1 subject=$2 text=$3 #此处的 xxxxx 就是刚刚复制存留的 api 接口地址. curl -i -X POST \ 'htt ...

  10. UiPath手把手教程

    UiPath下载安装与激活 链接: https://pan.baidu.com/s/1o5Ur-QNTxsnlhi97-losJQ 提取码: 9dmf 复制这段内容后打开百度网盘手机App,操作更方便 ...