期望得分: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的更多相关文章

  1. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  3. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  4. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  5. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  6. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  7. 「题解」NOIP模拟测试题解乱写I(29-31)

    NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...

  8. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...

  9. 2019.8.9 NOIP模拟测试15 反思总结

    日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...

  10. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

随机推荐

  1. Anrlr4 生成C++版本的语法解析器

    一. 写在前面 我最早是在2005年,首次在实际开发中实现语法解析器,当时调研了Yacc&Lex,觉得风格不是太好,关键当时yacc对多线程也支持的不太好,接着就又学习了Bison&F ...

  2. RF作用与目的

    robotframework自动化原理:通过ride工具编写脚本,加载指定的UI测试库,再通过pybot程序去运行指定脚本,调用浏览器驱动,打开浏览器,操作浏览器页面元素,达到模拟用户操作的行为 为什 ...

  3. 如何用js做关灯游戏

    编辑器  Sublime Text 3 <!DOCTYPE html><html lang="en"><head> <meta chars ...

  4. Oracle基于布尔的盲注总结

    0x01 decode 函数布尔盲注 decode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回3 当然值1,值2,值3也可以 ...

  5. AngelSword(天使之剑)漏洞框架的使用

    安装setuptools wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setupt ...

  6. IDA快捷键整理

    空格键 反汇编窗口切换文本跟图形 ESC退到上一个操作地址 G搜索地址或者符号 N重命名 分号键 注释 ALT+M 添加标签 CTRL+M 列出所有标签 CTRL +S 二进制段的开始地址结束地址 C ...

  7. 机器学习:weka中添加自己的分类和聚类算法

    不管是实验室研究机器学习算法或是公司研发,都有需要自己改进算法的时候,下面就说说怎么在weka里增加改进的机器学习算法. 一 添加分类算法的流程 1 编写的分类器必须继承 Classifier或是Cl ...

  8. PHP array_reverse

    1.函数的作用:将数组中的元素顺序反转 2.函数的参数: @params array $array 需要反转顺序的数组 @params $preversed_key  数值索引是否保持不变,非数值索引 ...

  9. boost::multi_index 多索引容器

    #include "stdafx.h" #include <string> #include <boost/multi_index_container.hpp&g ...

  10. Spring 框架基础(04):AOP切面编程概念,几种实现方式演示

    本文源码:GitHub·点这里 || GitEE·点这里 一.AOP基础简介 1.切面编程简介 AOP全称:Aspect Oriented Programming,面向切面编程.通过预编译方式和运行期 ...