NOIP模拟测试7

期望得分:60+60+60
实际得分:60+60+0
这次考试主要是T3搜索打挂了(我可是靠搜索吃饭的);
1.数组开小了,不过开大数组只拿到了10分的好成绩。
2.题意没审清(其实是他没说清)。
以后搜索不能打打挂了。
T1 方程的解:特判+exgcd
一看题就打了个exgcd,最后把exgcd删了骗了60分
但我们用exgcd是可以做的=_=(废话)。
考虑这个一次函数,然后就把纵截距和斜率一通特判AC >_<
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=;
y=;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return d;
}
int main()
{
#define C continue
ll t;
scanf("%lld",&t);
while(t--)
{
ll x,y,a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
if(!a&&!b)
{
if(!c)puts("ZenMeZheMeDuo");
else puts("");
C;
}
else if(!c)
{
if(!a&&!b)puts("ZenMeZheMeDuo");
else if(a*b>)puts("");
else puts("ZenMeZheMeDuo");
C;
}
else if(!a)
{
if(c%b==&&b&&b*c>)puts("ZenMeZheMeDuo");
else puts("");
}
else if(!b)
{
if(c%a==&&c&&a*c>)puts("ZenMeZheMeDuo");
else puts("");
C;
}
else if(a==&&b==)
{
if(c<=)puts("");
else if(c>)puts("ZenMeZheMeDuo");
else printf("%lld\n",c-);
C;
}
else if(a+b==c){puts("");C;}
else
{
if(a>&&b>&&c<){puts("");C;}
else if(a<&&b<&&c>){puts("");C;}
else
{
if(a<&&b<&&c<)a=-a,b=-b,c=-c;
ll gcd=exgcd(a,b,x,y);
if(c%gcd!=){puts("");C;}
else if(a*b<){puts("ZenMeZheMeDuo");}
else
{
//cout<<x<<endl;
x=(x%b+b)%b;
x*=(c/gcd);
x%=(b/gcd);
if(!x)x+=(b/gcd);
y=(c-a*x)/b;
if(y<=){puts("");continue;}
ll num=y/(a/gcd)+;
if(y%(a/gcd)==)num--;
if(num<=65535ll)printf("%lld\n",num);
else puts("ZenMeZheMeDuo");
}
} }
}
return ;
}
感谢mikufun的AC代码
T2 visit:组合数学+CRT
考试的时候推出式子了,也想到CRT了。
(嘿嘿刚才搬了好多吃的,发家致富!!!)
好啦继续说,但我不会打CRT板子(摆手)。
所以只能骗60分。
公式 ans=∑C(T,a)*C(T-a,b)*C(T-a-b,c)*C(T-a-b-c,d) (a+b+c+d==T&&a-b==n&&b-c==m)
大概说一下我的思路,以n,m均大于零为例
如果T=n+m,那么答案显然,C(T,n)。
如果T更小,显然无解
考虑T>n+m,因为最后一定要到n,m,所以如果你多往前走一步就一定会对应地往后走一步,左右同理。
由此可得:a-b=n,c-d=m(不用管a,b,c,d是神魔)然后就可以AC了
#include<cstdio>
#include<iostream>
#define MAXN 100005
#define ll long long
#include<cmath>
#define maxn 205
#define mod prime[num]
using namespace std;
ll t,js[MAXN],inv[MAXN],prime[],tot,m,num,w[];
ll abs(ll x)
{
return x<0ll?(-1ll*x):x;
}
ll qpower(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&)ans=ans*a%mod;
a=a*a%mod;
b>>=;
}
return ans%mod;
}
void PP()
{
ll x=m;
for(ll i=;i<=sqrt(m)+;i++)
{
if(x==)break;
if(x%i==)prime[++tot]=i,x/=i;
}
if(x>)prime[++tot]=x;
return ;
}
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=;
y=;
return ;
}
exgcd(b,a%b,x,y);
ll tmp=x;
x=y;
y=tmp-a/b*y;
return ;
}
ll crt()
{
ll ans=;
for(ll i=;i<=tot;i++)
{
ll xi=m/prime[i],x,y;
exgcd(xi,prime[i],x,y);
x=(x%prime[i]+prime[i])%prime[i];
ans=(ans+x*w[i]*xi)%m;
}
return ans%m;
}
void pre()
{
js[]=inv[]=;
for(ll i=;i<=min(mod,100000ll);i++)
{
js[i]=js[i-]*i%mod;
inv[i]=qpower(js[i],mod-);
}
return ;
}
ll C(ll n,ll m)
{
if(m==||m==n)return 1ll;
if(m>n)return 0ll;
return js[n]*inv[n-m]%mod*inv[m]%mod;
}
ll lucas(ll n,ll m)
{
if(m==||m==n)return 1ll;
if(m>n)return 0ll;
return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
int main()
{
ll a,b,c=,d=,ans=;
scanf("%lld%lld%lld%lld",&t,&m,&a,&b);
a=abs(a);b=abs(b);
if(m==){puts("");return ;}
ll k=t-abs(a)-abs(b);
if(k<||(k&)^){puts("");return ;}
k/=;PP();
for(num=;num<=tot;num++)
{
pre();
for(ll i=;i<=k;i++)
{
a+=i;
c+=i;
b+=(k-i);
d+=(k-i);
(w[num]+=lucas(t,a)*lucas(t-a,b)%mod*lucas(t-a-b,c)%mod*lucas(t-a-b-c,d)%mod)%=mod;
a-=i;
c-=i;
b-=(k-i);
d-=(k-i);
}
}
printf("%lld\n",crt());
return ;
}
T3 光:模拟+二分优化
我感觉这个题就是sb
但是不管怎么说,代码能力是很重要的一部分。
这个题有几个引理值得一提:
1.对于一个格子来说,之可能被(东南&&西北)||(东北&&西南)经过 证明:光线每次移动,其(x+y)||(x-y)奇偶性不变
我们可以画一个形象的图(自行)理解一下。
2.光线的碰撞反射次数只与n,m,k线性相关,这就不用我证明了叭。
3.光线的路径一定是一个环,所以它一定会回到初始状态,这可以作为终止边界。
在用。。。就是细心,耐心和lower_bound,upper_bound的应用了。
#include<bits/stdc++.h>
#define MAXN 200500
#define ll long long
#define mp make_pair
using namespace std;
vector<int>v1[MAXN*],v2[MAXN*];
map< pair<int,int>,bool >py;
ll ans;int n,m,k,sta,stb,sts,nn=,tot;
bool ok=,Getans=;
void search(int x,int y,int now)// 1 youshang 2 zuoxia 3 youxia 4 zuoshang
{
if(Getans)return ;
if(now==)
{
int id=x+y;bool za=,zb=;
int nxtx=(*--upper_bound(v1[id].begin(),v1[id].end(),x))+;
int nxty=id-nxtx;
if(sta+stb==id&&sta>=nxtx&&sta<=x&&sts==){nn++;if(nn!=){ans+=abs(sta-x);Getans=;return ;}}
ans+=abs(x-nxtx)+;
if(py[mp(nxtx,nxty+)])za=;if(py[mp(nxtx-,nxty)])zb=;
if(!za&&zb)search(nxtx,nxty+,);
else if(za&&!zb)search(nxtx-,nxty,);
else if(!za&&!zb){ok=;search(nxtx,nxty,);}
else {ok=;search(nxtx,nxty,);}
return ;
}
if(now==)
{
int id=x+y;bool za=,zb=;
int nxtx=(*upper_bound(v1[id].begin(),v1[id].end(),x))-;
int nxty=id-nxtx;
if(sta+stb==id&&sta>=x&&sta<=nxtx&&sts==){nn++;if(nn!=){ans+=abs(sta-x);Getans=;return ;}}
ans+=abs(x-nxtx)+;
if(py[mp(nxtx+,nxty)])za=;if(py[mp(nxtx,nxty-)])zb=;
if(!za&&zb)search(nxtx+,nxty,);
else if(za&&!zb)search(nxtx,nxty-,);
else if(!za&&!zb){ok=;search(nxtx,nxty,);}
else {ok=;search(nxtx,nxty,);}
return ;
}
if(now==)
{
int id=x-y+m+;bool za=,zb=;
int nxtx=(*upper_bound(v2[id].begin(),v2[id].end(),x))-;
int nxty=nxtx+m+-id;
if(sta-stb+m+==id&&sta<=nxtx&&sta>=x&&sts==){nn++;if(nn!=){ans+=abs(sta-x);Getans=;return ;}}
ans+=abs(x-nxtx)+;
if(py[mp(nxtx+,nxty)])za=;if(py[mp(nxtx,nxty+)])zb=;
if(!za&&zb)search(nxtx+,nxty,);
else if(za&&!zb)search(nxtx,nxty+,);
else if(!za&&!zb){ok=;search(nxtx,nxty,);}
else {ok=;search(nxtx,nxty,);}
return ;
}
if(now==)
{
int id=x-y+m+;bool za=,zb=;
int nxtx=(*--upper_bound(v2[id].begin(),v2[id].end(),x))+;
int nxty=nxtx+m+-id;
if(sta-stb+m+==id&&sta>=nxtx&&sta<=x&&sts==){nn++;if(nn!=){ans+=abs(sta-x);Getans=;return ;}}
ans+=abs(x-nxtx)+;
if(py[mp(nxtx-,nxty)])za=;if(py[mp(nxtx,nxty-)])zb=;
if(!za&&zb)search(nxtx-,nxty,);
else if(za&&!zb)search(nxtx,nxty-,);
else if(!za&&!zb){ok=;search(nxtx,nxty,);}
else {ok=;search(nxtx,nxty,);}
return ;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
while(k--)
{
int a,b;
scanf("%d%d",&a,&b);
v1[a+b].push_back(a);
v2[a-b+m+].push_back(a);
py[mp(a,b)]=;
}
for(int i=;i<=n+;i++)
{
v1[i].push_back(i);
v2[i+m+].push_back(i);
v1[i+m+].push_back(i);
v2[i].push_back(i);
py[mp(i,)]=;py[mp(i,m+)]=;
}
for(int i=;i<=m+;i++)
{
v1[i].push_back();
v2[m+-i].push_back();
v1[i+n+].push_back(n+);
v2[n+-i+m+].push_back(n+);
py[mp(,i)]=;py[mp(n+,i)]=;
}
for(int i=;i<=n+m+;i++)sort(v1[i].begin(),v1[i].end());
for(int i=;i<=n+m+;i++)sort(v2[i].begin(),v2[i].end());
string ss;
cin>>sta>>stb>>ss;
if(ss=="NE")sts=,search(sta,stb,);
else if(ss=="NW")sts=,search(sta,stb,);
else if(ss=="SE")sts=,search(sta,stb,);
else if(ss=="SW")sts=,search(sta,stb,);
cout<<(ok==?(ans/):ans)<<endl;
return ;
}
总结:暴力不能打挂,模板必须理解
NOIP模拟测试7的更多相关文章
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
- 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- NOIP模拟测试1(2017081501)
好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 2019.8.14 NOIP模拟测试21 反思总结
模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...
- 2019.8.9 NOIP模拟测试15 反思总结
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
- 2019.8.1 NOIP模拟测试11 反思总结
延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...
随机推荐
- SpringBoot运行时动态添加数据源
此方案适用于解决springboot项目运行时动态添加数据源,非静态切换多数据源!!! 一.多数据源应用场景: 1.配置文件配置多数据源,如默认数据源:master,数据源1:salve1...,运行 ...
- linux netlink通信机制简介
一.什么是Netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口. Netlink 是一种特殊的 s ...
- 利用 turtle库绘制简单图形
turtle库是python的基础绘图库,这个库被介绍为一个最常用的用来介绍编程知识的方法库,其主要是用于程序设计入门,是标准库之一,利用turtle可以制作很多复杂的绘图. turtle名称含义为“ ...
- Java基础-开篇
之前在新浪博客写了不少springmvc的相关技术,但新浪博客毕竟不是专业的技术博客,添加代码很不方便,就开始在博客园试试了. 使用java开发也不少年了,准备再次整理一些java基础知识,当然,这次 ...
- Redis系列(一):Redis简介
一.Redis概述 Redis是一个开源(遵循BSD协议)Key-Value数据结构的内存存储系统,用作数据库.缓存和消息代理.它支持5种数据结构:字符串string.哈希hash.列表list.集合 ...
- 讲真,MySQL索引优化看这篇文章就够了
本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ...
- Powershell寻找域管在线服务器
记录线下Powershell在域环境中对于服务器的信息收集 Powershell的脚本有很多,在内网渗透测试中不仅能扫,能爆,能转发,还能做更多的事情.我们常用的脚本有Powersploit,Empi ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- [Luogu3932] 浮游大陆的68号岛
题目背景 大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg 浮游大陆的68号岛,位于浮游大陆的边境地带.平时很少有人造访. 岛上被浓厚的森林覆盖. ...
- Luogu1119灾后重建
题目背景 BBB 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公 ...