T1:神炎皇

  又是数学题,气死,根本不会。

  首先考虑式子\(a+b=ab\),我们取\(a\)与\(b\)的\(gcd\):\(d\),那么式子就可以改写成:

\[(a'+b')*d=a'b'd^{2}
\]
\[a'+b'=a'b'd
\]

  现在,有\(a'\)与\(b'\)互质,那么\(a'+b'\)一定不是\(a'b'\)的因子,这很显然,就不证了,那么\(a'+b'\)一定整除\(d\)。

\(\because\)\(a+b\)小于等于\(n\),且\(a'+b'\)小于或等于\(d\)(整除);

\(\therefore\)\(a'+b'\)小于或等于\(\sqrt{n}\);

  枚举\(a'+b'=k\),可以知道\(d\)有\(n/k^{2}\)个,证明:

\(\because\) \((a'+b')|d\)

\(\therefore\) \((a'+b')*d=(a'+b')^{2}*x<=n\)

  显然,\(d\)有\(x\)个。

  另外,考虑合法的\(a'+b'\)的对数,可以知道是\(\phi\)\((k)\)个,证明见土哥的博客。

  附上AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. namespace STD
  4. {
  5. #define rr register
  6. #define inf LONG_LONG_MAX
  7. typedef long long ll;
  8. const ll N=100000000000000;
  9. const int SIZE=1e7+4;
  10. ll n,cnt;
  11. ll ans;
  12. ll prime[SIZE];
  13. ll phi[SIZE];
  14. bool isnotprime[SIZE];
  15. ll read()
  16. {
  17. rr ll x_read=0,y_read=1;
  18. rr char c_read=getchar();
  19. while(c_read<'0'||c_read>'9')
  20. {
  21. if(c_read=='-') y_read=-1;
  22. c_read=getchar();
  23. }
  24. while(c_read<='9'&&c_read>='0')
  25. {
  26. x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
  27. c_read=getchar();
  28. }
  29. return x_read*y_read;
  30. }
  31. void pre()
  32. {
  33. for(rr ll i=2;i<=SIZE;i++)
  34. {
  35. if(!isnotprime[i]) prime[++cnt]=i,phi[i]=i-1;
  36. for(rr ll j=1;j<=cnt&&i*prime[j]<=SIZE;j++)
  37. {
  38. isnotprime[i*prime[j]]=1;
  39. if(i%prime[j]==0)
  40. {
  41. phi[i*prime[j]]=phi[i]*prime[j];
  42. break;
  43. }else phi[i*prime[j]]=phi[i]*(prime[j]-1);
  44. }
  45. }
  46. }
  47. };
  48. using namespace STD;
  49. int main()
  50. {
  51. pre();
  52. n=read();
  53. ll ceil=sqrt(n);
  54. for(rr ll i=1;i<=ceil;i++)
  55. {
  56. ll sum=phi[i];
  57. ll d=n/(i*i);
  58. ans+=sum*d;
  59. }
  60. cout<<ans;
  61. }

T2:降雷皇

  太明显的一个数据结构优化DP了,求最长上升子序列即可,考场AC。

  直接上代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. namespace STD
  4. {
  5. #define rr register
  6. #define inf INT_MAX
  7. typedef long long ll;
  8. const int N=100004;
  9. const int mod=123456789;
  10. const int R=100003;
  11. int n,type;
  12. int r[N];
  13. #define lc id<<1
  14. #define rc id<<1|1
  15. struct node
  16. {
  17. int maxn;
  18. ll cnt;
  19. node(){maxn=cnt=0;}
  20. node(int maxn_,ll cnt_){maxn=maxn_,cnt=cnt_;}
  21. };
  22. class Line_tree
  23. {
  24. private:
  25. node a[R<<2];
  26. void Insert(int,int,int,int,node);
  27. node Query(int,int,int,int,int);
  28. public:
  29. Line_tree(){}
  30. void insert(int pos,node val){Insert(1,1,R-1,pos,val);}
  31. node query(int st,int en)
  32. {
  33. if(st>en) return node(0,0);
  34. return Query(1,1,R-1,st,en);
  35. }
  36. }t;
  37. void Line_tree::Insert(int id,int l,int r,int pos,node val)
  38. {
  39. if(l==r)
  40. {
  41. if(a[id].maxn==val.maxn)
  42. a[id].cnt=(a[id].cnt+val.cnt)%mod;
  43. else if(a[id].maxn<val.maxn)
  44. a[id]=val;
  45. return;
  46. }
  47. int mid=(l+r)>>1;
  48. if(pos<=mid) Insert(lc,l,mid,pos,val);
  49. else Insert(rc,mid+1,r,pos,val);
  50. a[id]=(a[lc].maxn>a[rc].maxn)?a[lc]:a[rc];
  51. if(a[lc].maxn==a[rc].maxn)
  52. a[id].cnt=(a[lc].cnt+a[rc].cnt)%mod;
  53. }
  54. node Line_tree::Query(int id,int l,int r,int st,int en)
  55. {
  56. if(st<=l&&r<=en) return a[id];
  57. int mid=(l+r)>>1;
  58. node ret=node(-inf,0),temp;
  59. if(st<=mid)
  60. {
  61. temp=Query(lc,l,mid,st,en);
  62. if(temp.maxn>ret.maxn)
  63. ret=temp;
  64. else if(temp.maxn==ret.maxn)
  65. ret.cnt=(ret.cnt+temp.cnt)%mod;
  66. }
  67. if(mid<en)
  68. {
  69. temp=Query(rc,mid+1,r,st,en);
  70. if(temp.maxn>ret.maxn)
  71. ret=temp;
  72. else if(temp.maxn==ret.maxn)
  73. ret.cnt=(ret.cnt+temp.cnt)%mod;
  74. }
  75. return ret;
  76. }
  77. #undef lc
  78. #undef rc
  79. int read()
  80. {
  81. rr int x_read=0,y_read=1;
  82. rr char c_read=getchar();
  83. while(c_read<'0'||c_read>'9')
  84. {
  85. if(c_read=='-') y_read=-1;
  86. c_read=getchar();
  87. }
  88. while(c_read<='9'&&c_read>='0')
  89. {
  90. x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
  91. c_read=getchar();
  92. }
  93. return x_read*y_read;
  94. }
  95. };
  96. using namespace STD;
  97. int main()
  98. {
  99. n=read(),type=read();
  100. for(rr int i=1;i<=n;i++)
  101. r[i]=read();
  102. int ans=-inf;
  103. ll num=0;
  104. for(rr int i=1;i<=n;i++)
  105. {
  106. node temp=t.query(1,r[i]-1);
  107. temp.maxn++;
  108. if(temp.cnt==0)
  109. temp.cnt=1;
  110. if(ans<temp.maxn)
  111. {
  112. num=temp.cnt;
  113. ans=temp.maxn;
  114. }
  115. else if(ans==temp.maxn)
  116. num=(num+temp.cnt)%mod;
  117. t.insert(r[i],temp);
  118. }
  119. cout<<ans;
  120. if(type==1)
  121. cout<<num;
  122. }

T3:幻魔皇

  首先很明显,任意两个白点的\(LCA\)要么是白的,要么是黑的,分类讨论即可。

  首先观察一个性质,就是从第三层点开始,所有白点数目满足斐波那契数列,从第二层点开始,黑点满足斐波那契数列。

  且,由于树的拓扑性质,所有子树也满足这种性质。

  首先考虑\(LCA\)为白点的性质,那么就是\(LCA\)与儿子们匹配,直接用斐波那契数求即可。

  至于说黑点的情况,就是儿子们两两匹配即可。

  复杂度是\(O(n^{2}+n^{3})\)

  前缀和优化可以到\(O(n+n^{2})\)

  代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. namespace STD
  4. {
  5. #define rr register
  6. #define inf INT_MAX
  7. typedef long long ll;
  8. const int N=5004;
  9. const int mod=123456789;
  10. int n;
  11. ll fib[N];
  12. ll sum[N];
  13. ll ans[N<<1];
  14. int read()
  15. {
  16. rr int x_read=0,y_read=1;
  17. rr char c_read=getchar();
  18. while(c_read<'0'||c_read>'9')
  19. {
  20. if(c_read=='-') y_read=-1;
  21. c_read=getchar();
  22. }
  23. while(c_read<='9'&&c_read>='0')
  24. {
  25. x_read=(x_read<<3)+(x_read<<1)+(c_read^48);
  26. c_read=getchar();
  27. }
  28. return x_read*y_read;
  29. }
  30. void pre()
  31. {
  32. fib[1]=1;
  33. sum[1]=1;
  34. for(rr int i=2;i<=5002;i++)
  35. {
  36. fib[i]=(fib[i-1]+fib[i-2])%mod;
  37. sum[i]=(sum[i-1]+fib[i])%mod;
  38. }
  39. }
  40. };
  41. using namespace STD;
  42. int main()
  43. {
  44. pre();
  45. n=read();
  46. for(rr int i=2;i<=n-1;i++)
  47. ans[i]=fib[n-i]*fib[i-1]%mod;
  48. for(rr int i=2;i<=n-2;i++)
  49. for(rr int j=3;j<=n-2;j++)
  50. {
  51. int x=max(i,j);
  52. ans[i+j]=(ans[i+j]+sum[n-x-1]*fib[i-1]%mod*fib[j-2]%mod)%mod;
  53. }
  54. for(rr int i=2;i<=n-2;i++)
  55. ans[i+1]=(ans[i+1]+sum[n-i-1]*fib[i-1]%mod)%mod;
  56. for(rr int i=1;i<=(n<<1);i++)
  57. printf("%lld ",ans[i]);
  58. }

学到了什么:

  关于T1:

  首先,我忘了如何线性求phi函数了,正好复习了一下。

  考试的时候推了那个等式了,也除了\(GCD\)但是对phi函数这个东西不熟,结果啥也没搞出来,丢了个暴力就走了,还是对数论不熟,要复习了。。。。。。

  关于T2:

  考场AC还是很开心的,之前做过这种题,证明之前的知识都学到手了,还不错。

  关于T3:

  考场上看出性质了,原本搞了没有优化的正解(自我感觉是正解,实际上推了推,大体是对的),但是没时间码对,直接挂了,要是码力再强点,兴许有80分吧,谁知道呢,做这道时想起了之前做的一道有关斐波那契的题,以为巧妙编号就可以靠编号搞出\(LCA\)因此想歪了。。。。。。

NOIP模拟26「神炎皇·降雷皇·幻魔皇」的更多相关文章

  1. NOIP 模拟 $26\; \rm 神炎皇$

    题解 \(by\;zj\varphi\) 一道 \(\varphi()\) 的题. 对于一个合法的数对,设它为 \((a*m,b*m)\) 则 \(((a+b)*m)|a*b*m^2\),所以 \(( ...

  2. noip模拟26[肾炎黄·酱累黄·换莫黄]

    \(noip模拟26\;solutions\) 这个题我做的确实是得心应手,为啥呢,因为前两次考试太难了 T1非常的简单,只不过我忘记了一个定理, T2就是一个小小的线段树,虽然吧我曾经说过我再也不写 ...

  3. 「10.10」神炎皇(欧拉函数)·降雷皇(线段树,DP)·幻魔皇

    A. 神炎皇 很好的一道题,可能第一次在考场上遇到欧拉函数 题意:对于一个整数对 $(a,b)$,若满足 $a\times b\leq n$且$a+b$是$a\times b$的因子, 则称为神奇的数 ...

  4. [考试总结]noip模拟26

    首先看到这样中二的题目心头一震.... 然而发现又是没有部分分数的一天. 然而正解不会打.... 那还是得要打暴力. 但是这套题目有两个题目只有一个参数. 所以... (滑稽).jpg 然后我就成功用 ...

  5. 2021.7.28考试总结[NOIP模拟26]

    罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...

  6. NOIP 模拟 $26\; \rm 降雷皇$

    题解 \(by\;zj\varphi\) 用树状数组优化一下求最长上升子序列即可. 至于第二问,在求出答案后开 \(n\) 棵线段树,每颗维护当前最长上升子序列长度的方案数. Code #includ ...

  7. NOIP 模拟 $26\; \rm 幻魔皇$

    题解 \(by\;zj\varphi\) 观察可发现一个点向它的子树走能到的白点,黑点数是一个斐波那契数列. 对于白色点对,可以分成两种情况: 两个白点的 \(lca\) 是其中一个白点 两个白点的 ...

  8. noip模拟赛 伪神

    题目背景 一切就绪 但愿,这样就好 自那之后的五年—— 作为封印持续增大的结果,在我体内积蓄了庞大的光精灵的力量 在幻灯结界里觉醒过来的我,和从封印解放出的德米奥格,就如同字面意思所述的,获得了等同于 ...

  9. NOIP模拟26

    把题解沽了好久了,今天还是不想写,我们靠的B卷其实挺水的,但是我就是想吐槽一下!咋还带题目里面放题解的?题里一点题解的线索都没有,但是玄机竟然在题目里! 我也是醉了,T1就是一个贪心,题目说贪婪,T2 ...

随机推荐

  1. solr(CVE-2017-12629)远程命令执行

    影响版本Apache Solr 5.5.0到7.0.1版本 solr(CVE-2017-12629-RCE) 环境搭建 1.burp检测 创建listen POST /solr/demo/config ...

  2. 自学linux——15.云主机的购买流程及域名的购买备案解析

    项目上线流程 一.服务器选配购买 项目上线的服务器必须是外网服务器 1.服务器购买情况 真实服务器(成本过高,购买内部自用) 云服务器(上线首选):阿里云,腾讯云,华为云 2.购买阿里云服务器:htt ...

  3. 在Linearlayout中新增ScrollView支持滚动

    https://blog.csdn.net/wenzhi20102321/article/details/53491176 1.一般只需要在布局中加个ScrollView即可 2.如果布局中包含lis ...

  4. 为什么crictl和ctr的输出有时不一样

    containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间 cr ...

  5. 花1个月时间准备 面试华为,薪资和定级都谈好了却被拒,HR竟说......

    说在前面,千万不要频繁跳槽. 本来华为很想去的,面试前花了一个月的时间准备,面试过程挺顺利的,也拒绝了其他的所有面试邀请,而我拒绝其他面试邀请的底气,则是之前面试过程中的良好表现,薪资和定级都谈好了. ...

  6. Android面试官:说说你对 Binder 驱动的了解?

    面试官提了一个问题:说说你对 binder 驱动的了解.这个问题虽有些 "面试造火箭" 的无奈,可难点就是亮点.价值所在,是筛选面试者的有效手段.如果让你回答,你能说出多少呢?我们 ...

  7. Jetpack Compose学习(2)——文本(Text)的使用

    原文: Jetpack Compose学习(2)--文本(Text)的使用 | Stars-One的杂货小窝 对于开发来说,文字最为基础的组件,我们先从这两个使用开始吧 本篇涉及到Kotlin和DSL ...

  8. NOIP 模拟 $15\; \rm \text{玫瑰花精}$

    题解 \(by\;zj\varphi\) 一道线段树题目 这道题可以通过维护一棵线段树,线段树上的每个节点维护 \(\rm l,r,len,p\) 分别表示这段区间最左边的花精,最右边的花精,被两只花 ...

  9. 第11篇-认识Stub与StubQueue

    在 第10篇-初始化模板表 我们介绍过TemplateInterpreter::initialize()函数,在这个函数中会调用TemplateTable::initialize()函数初始化模板表, ...

  10. DotNetCore深入了解:HTTPClientFactory类

    一.HttpClient使用 在C#中,如果我们需要向某特定的URL地址发送Http请求的时候,通常会用到HttpClient类.会将HttpClient包裹在using内部进行声明和初始化,如下面的 ...