Luogu的五周年庆典比赛,还是比较满意的。

题目清新不毒瘤,数据优质不卡常,解法自然,为出题人点赞。

前三题的难度都很低,T5个人感觉还好。但是最后那个splay+hash是什么神仙东西

最后好像Rank50+,300pts里面没有时间的一个自带优越小常数

好了开始看题。

A: P4710「物理」平抛运动

这还是需要一定的物理基础的。在zitai dalao的教导下我终于还是听懂了。

首先我们直接用一下给的这张图:

注意题目里的一句话:

首先,由于单位均为标准单位,所以所有结果均可以直接数字运算;视为质点意味着没有体积。

然后我们直接可以对于那个三角形的斜边和另一条直角边用三角函数表示出来:

其中横向的速度$v_x=v\ sin\ \theta \(,纵向的速度\)v_y=v\ cos\ \theta$

然后我们用物理中的一个加速度公式得到\(v_y=g\cdot t\)这就是公式我也没办法

所以我们可以先解出时间\(t=\frac{v\ cos\ \theta}{g}\)

然后小球的初始位置\((x,y)\)就很好求了,其中:

  • \(x=v_x\cdot t\)(将速度分解后横向的就是匀速运动)
  • \(y=\frac{gt^2}{2}\)(这个初中生都知道吧)

然后就可以搞出来了

CODE

  1. #include<cstdio>
  2. #include<cmath>
  3. using namespace std;
  4. double v,a;
  5. int main()
  6. {
  7. scanf("%lf%lf",&v,&a); double t=v*cos(a)/10.0;
  8. printf("%.15lf %.15lf",v*sin(a)*t,t*t*5.0);
  9. return 0;
  10. }

B: P4711 「化学」相对分子质量

由于感觉我很久没有写过大模拟了,然后就在比赛的时候义无反顾地开了这道题。

模拟题讲思路仅为个人菜鸡做法:

  1. 首先把有水合物的先搞出来单独处理掉(注意水之前的系数
  2. 为了方便处理,我们对整个串预处理用一下,把所有的类似于"CO_{2}"的东西都变成"C_{1}O_{2}"
  3. 然后我们只需要找到所有的"_"然后对于前面的一整段一起处理即可,这样对于括号里面的方法就和外面一样了。
  4. 关于精度的处理我用了一个叫sprintf&&sscanf奇技淫巧。当然都乘上\(2\)最后判断会更好。
  5. 对于那些化学分子式应该没有什么简单的方法,直接手动存map即可。

Upt:原来水合物是纯净物,害我期末考被科学老师骂了。把水合物当成混合物了

CODE

  1. #include<string>
  2. #include<map>
  3. #include<iostream>
  4. #include<cstdio>
  5. #include<cstring>
  6. using namespace std;
  7. map <string,double> w;
  8. string s;
  9. int len,now,last,num=-1;
  10. double v,ans;
  11. char c[10];
  12. inline void init(void)
  13. {
  14. w["H"]=1; w["C"]=12; w["N"]=14; w["O"]=16;
  15. w["F"]=19; w["Na"]=23; w["Mg"]=24; w["Al"]=27;
  16. w["Si"]=28; w["P"]=31; w["S"]=32; w["Cl"]=35.5;
  17. w["K"]=39; w["Ca"]=40; w["Mn"]=55; w["Fe"]=56;
  18. w["Cu"]=64; w["Zn"]=65; w["Ag"]=108; w["I"]=127;
  19. w["Ba"]=137; w["Hf"]=178.5; w["Pt"]=195; w["Au"]=197; w["Hg"]=201;
  20. }
  21. inline double solve(int l,int r)
  22. {
  23. string t=""; register int i;
  24. for (i=l;i<=r;++i)
  25. t+=s[i]; double ans=0;
  26. //cout<<t<<endl;
  27. if (t[0]!='(') return w[t];
  28. int last=1,len=t.size();
  29. for (i=0;i<len;++i)
  30. if (t[i]=='_')
  31. {
  32. string temp=""; if (i-1!=last) temp+=t[last],temp+=t[i-1]; else temp+=t[last];
  33. //cout<<temp<<endl;
  34. v=w[temp]; now=0; i+=2;
  35. while (i<len)
  36. {
  37. if (t[i]=='}') break;
  38. now=now*10+t[i]-'0'; ++i;
  39. }
  40. ans+=v*now; last=i+1;
  41. }
  42. return ans;
  43. }
  44. inline int find(int st)
  45. {
  46. for (register int i=st;i<s.size();++i)
  47. if (s[i]==')') return i;
  48. }
  49. int main()
  50. {
  51. ios::sync_with_stdio(false);
  52. register int i; cin>>s; len=s.size(); init();
  53. for (i=0;i<len;++i)
  54. if (s[i]=='~') { num=i; break; }
  55. if (num!=-1)
  56. {
  57. for (now=0,i=num+1;i<len;++i)
  58. if (s[i]!='H') now=now*10+s[i]-'0'; else break;
  59. ans+=now?now*18:18; s.erase(num,s.size()-num); len=s.size();
  60. }
  61. //cout<<s<<endl;
  62. for (i=0;i<s.size();++i)
  63. if (s[i]>='A'&&s[i]<='Z')
  64. {
  65. if (s[i+1]>='a'&&s[i+1]<='z')
  66. {
  67. if (s[i+2]!='_') s.insert(i+2,"_{1}");
  68. } else
  69. {
  70. if (s[i+1]!='_') s.insert(i+1,"_{1}");
  71. }
  72. } len=s.size();
  73. //cout<<s<<endl;
  74. for (i=0;i<len;++i)
  75. {
  76. //cout<<s[i]<<endl;
  77. if (s[i]=='(') i=find(i+1)+1;
  78. if (s[i]=='_')
  79. {
  80. v=solve(last,i-1); now=0; i+=2;
  81. while (i<len)
  82. {
  83. if (s[i]=='}') break;
  84. now=now*10+s[i]-'0'; ++i;
  85. }
  86. ans+=v*now; last=i+1;
  87. }
  88. }
  89. sprintf(c+1,"%.1lf",ans); int len=strlen(c+1);
  90. if (c[len]=='5')
  91. {
  92. for (i=1;i<=len;++i)
  93. putchar(c[i]);
  94. } else
  95. {
  96. for (i=1;i<=len-2;++i)
  97. putchar(c[i]);
  98. }
  99. return 0;
  100. }

C: P4712 「生物」能量流动

一道非常简单的贪心题。

我们首先注意到既然要让能量的利用价值都最大,那么肯定转移的次数越少越好

因此我们每次摄食都从当前允许的编号最小的生物开始摄食。

同时对于所有的点(除了人类)来说,刚刚摄取到足够的能量就可以了,因为剩下的都应该给人。

由于\(r_i<r_{i+1}\),所以我们之前从之前的一路推过来即可。如果没有这个条件就要上线段树了。

CODE

  1. // luogu-judger-enable-o2
  2. #include<cstdio>
  3. using namespace std;
  4. const int N=1e5+5;
  5. int last,n,r,x;
  6. double a[N],b[N],ans;
  7. inline char tc(void)
  8. {
  9. static char fl[100000],*A=fl,*B=fl;
  10. return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
  11. }
  12. inline void read(int &x)
  13. {
  14. x=0; char ch=tc();
  15. while (ch<'0'||ch>'9') ch=tc();
  16. while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
  17. }
  18. int main()
  19. {
  20. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  21. register int i; read(n); read(x); a[0]=x;
  22. for (i=1;i<=n;++i)
  23. {
  24. read(x); b[i]=x; read(r);
  25. while (b[i])
  26. {
  27. if (last>r) return puts("-1"),0;
  28. if (a[last]*0.2>b[i]) a[last]-=b[i]*5,a[i]+=b[i],b[i]=0; else a[i]+=a[last]*0.2,b[i]-=a[last]*0.2,a[last]=0,++last;
  29. }
  30. }
  31. for (i=0;i<=n;++i)
  32. ans+=a[i]*0.2;
  33. return printf("%.8lf",ans),0;
  34. }

F: P4714 「数学」约数个数和

一道非常猥琐的数学题,奇技淫巧爆棚。

我们先分析当\(K=0\)时,就是典型的约数个数公式。但我们进一步想一下这个公式是怎么来的:

我们将原来的数\(N\)拆分成\(\prod {p_i}^{a_i}\)。然后考虑对于每一个\({p_i}^{a_i}\),都有\([0,a_i]\)中选择方法,所以最后的个数就是\(\prod a_i+1\)

同样我们考虑对于\(K=1\)时,我们设现在的\(a_i=2\)。那么有那些可能?

就是\((0,0);(0,1);(0,1,2)\),那么方案数就变到\(1+2+3\)了。

或者我们可以更抽象化这个问题,令\(n=a_i\),则有:

\(a_1+a_2+......+a_{k+1}=n\ (a_i\ge 0)\)

求合法的方案数。

我们左右都加上\(k+1\)得到:

\(a_1+a_2+......+a_{k+1}=n+k+1(a_i>=1)\)

然后就相当于在\(n+k+1\)个位置上选\(k+1\)个位置的问题了。这个的方案数就是\(C_{n+k+1}^{k+1}\)

这个鬼东西在\(K\le 10^{18}\)的情况下算不了,所以我们换一下变成\(C_{n+k+1}^{n}\)

最后要求的就是\(\prod C_{a_i+k+1}^{a_i}\)

由于\(a_i<=60\),所以我们组合数部分直接上公式:

\(C_m^n={\frac{m!}{n!\cdot(m-n)!}=\frac{\prod_{i=m-n+1}^m}{n!}}\)

然后\(n!\)逆元处理。但由于这里\(N\le 10^{18}\),所以要用到复杂度为神奇的\(O(n^{\frac{1}{4}})\)的Pollad-rho和大素数判定Miller-Rabin。这里不再多讲。

CODE

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<ctime>
  4. #include<map>
  5. using namespace std;
  6. typedef long long LL;
  7. const int mod=998244353;
  8. map <LL,int> t;
  9. map <LL,int> ::iterator it;
  10. LL n,k,c=2333333,ans=1,inv[105];
  11. inline LL quick_mul(LL n,LL m,LL mod)
  12. {
  13. LL tot=0;
  14. while (m)
  15. {
  16. if (m&1) tot=(tot+n)%mod;
  17. n=(n+n)%mod; m>>=1;
  18. }
  19. return tot;
  20. }
  21. inline LL quick_pow(LL x,LL p,LL mod)
  22. {
  23. LL tot=1;
  24. while (p)
  25. {
  26. if (p&1) tot=quick_mul(tot,x,mod);
  27. x=quick_mul(x,x,mod); p>>=1;
  28. }
  29. return tot;
  30. }
  31. inline LL C(LL n,LL m)
  32. {
  33. LL tot=1;
  34. for (register int i=1;i<=m;++i)
  35. tot=tot*(n-i+1)%mod*inv[i]%mod;
  36. return tot;
  37. }
  38. inline LL gcd(LL n,LL m)
  39. {
  40. return m?gcd(m,n%m):n;
  41. }
  42. inline bool Miller_Rabin(LL x)
  43. {
  44. if (x==2) return 1;
  45. if (x<2||x&1==0) return 0;
  46. LL t=0,u=x-1;
  47. while (u&1==0) ++t,u>>=1;
  48. for (register int i=1;i<=20;++i)
  49. {
  50. LL p=rand()%(x-1)+1,lst=quick_pow(p,u,x);
  51. for (register int j=1;j<=t;++j)
  52. {
  53. LL now=quick_mul(lst,lst,x);
  54. if (now==1&&lst!=1&&lst!=x-1) return 0; lst=now;
  55. }
  56. if (lst!=1) return 0;
  57. }
  58. return 1;
  59. }
  60. inline LL Pollard_rho(LL n,LL c)
  61. {
  62. LL t=1,k=2,x=rand()%(n-1)+1,y=x;
  63. for (;;)
  64. {
  65. x=(quick_mul(x,x,n)+c)%n;
  66. LL p=gcd((y-x+n)%n,n);
  67. if (p!=1&&p!=n) return p;
  68. if (x==y) return n;
  69. if (++t==k) k<<=1,y=x;
  70. }
  71. }
  72. inline void find(LL n,LL c)
  73. {
  74. if (n==1) return;
  75. if (Miller_Rabin(n)) { ++t[n]; return; }
  76. LL p=n,t=c;
  77. while (p>=n) p=Pollard_rho(n,c--);
  78. find(p,t); find(n/p,t);
  79. }
  80. int main()
  81. {
  82. scanf("%lld%lld",&n,&k); srand(time(0)); find(n,c);
  83. for (register int i=1;i<=100;++i)
  84. inv[i]=quick_pow(i,mod-2,mod);
  85. for (it=t.begin();it!=t.end();++it)
  86. {
  87. ans=quick_mul(ans,C((k+1+it->second)%mod,it->second),mod);
  88. }
  89. printf("%lld",ans);
  90. return 0;
  91. }

注意数可能会涉及两个\(long\ long\)级别的相乘但是模数也是\(long\ long\)的情况,所以我们还要写一个快速乘

Luogu第二道黑题get

剩下的两题由于我水平也有限,还是等坑吧。

【LGR-048 五周年庆贺】洛谷6月月赛的更多相关文章

  1. 洛谷4月月赛R2

    洛谷4月月赛R2 打酱油... A.koishi的数学题  线性筛约数和就可以\(O(N)\)了... #include <iostream> #include <cstdio> ...

  2. 洛谷3月月赛 R1 Step! ZERO to ONE

    洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ...

  3. 【洛谷5月月赛】玩游戏(NTT,生成函数)

    [洛谷5月月赛]玩游戏(NTT,生成函数) 题面 Luogu 题解 看一下要求的是什么东西 \((a_x+b_y)^i\)的期望.期望显然是所有答案和的平均数. 所以求出所有的答案就在乘一个逆元就好了 ...

  4. 【LGR-054】洛谷10月月赛II

    [LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...

  5. 【LGR-051】洛谷9月月赛

    [LGR-051]洛谷9月月赛 luogu 签到题 description 给出\(K\)和质数\(m\),求最小的\(N\)使得\(111....1\)(\(N\)个\(1\))\(\equiv k ...

  6. 「LGR-049」洛谷7月月赛 D.Beautiful Pair

    「LGR-049」洛谷7月月赛 D.Beautiful Pair 题目大意 : 给出长度为 \(n\) 的序列,求满足 \(i \leq j\) 且 $a_i \times a_j \leq \max ...

  7. 洛谷9月月赛round2

    洛谷9月月赛2 t1 题意:懒得说了 分析:模拟 代码: program flag; var a:..,..]of char; n,i,m,j,x,y,ans,k:longint; begin ass ...

  8. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  9. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  10. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

随机推荐

  1. 排错-lr回放错误Vuser failed to initialize extensi...解决方法

    lr回放错误:Vuser failed to initialize extension LrXml.dll解决方法   by:授客 QQ:1033553122 步骤1:找到LR安装位置,打开协议目录 ...

  2. MVC与单元测试实践之健身网站(八)-统计分析

    ​统计分析模块与之前的内容相对独立,用于记录并跟踪各部位围度的变化.还需提供对所作计划的分析,辅助使计划更合理. 一 围度记录 这儿可以记录各项身体围度指标,现在包括体重在内身体上上下下基本全部提供了 ...

  3. .NET中资源文件的使用

    工作需要,为VB.NET WinForm程序提供一个中英文界面切换功能,大方向有三个ini.XML.资源文件. 首先ini太过时,坚决不打算用.资源文件和XML相比提供了一个资源文件管理器,编写键值对 ...

  4. springcloud 入门 9 (消息总线)

    Spring cloud bus: Spring cloud bus通过轻量消息代理连接各个分布的节点.这会用在广播状态的变化(例如配置变化)或者其他的消息指令.Spring bus的一个核心思想是通 ...

  5. (后端)Java跨域过滤器

    private FilterConfig config = null; @Override public void init(FilterConfig config) throws ServletEx ...

  6. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

    Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...

  7. Conjob For hybris

    1.Defining the Job 写conjob的逻辑:core包下当做service层(要继承AbstractJobPerformable<CronJobModel>) public ...

  8. Shell的基础介绍和案例

    一.shell脚本基础 1.第一个脚本 vim  first.sh 分别使用三种方法可以执行脚本:   ./first.sh (需要有可执行的权限)   sh    first.sh   .  fir ...

  9. 实验吧web题(26/26)全writeup!超详细:)

    #简单的SQL注入 http://www.shiyanbar.com/ctf/1875 1)试着在?id=1,没有错误 2)试着?id=1',出错了,有回显,说明有注入点: You have an e ...

  10. Deepin中设置文件或文件夹权限

    Deepin中设置文件或文件夹权限 -R 递归进行某项操作,不论是删除文件夹或者修改文件夹下所有文件权限   权限更改,777相当于完全控制权限: 更改一个文件夹或文件的权限:chmod 777 文件 ...