打了计蒜客上的银川重现赛,总体感觉难度上确实比平时区域赛要低上一些。

这里补一下F题和G题的思路和代码。

upd:I题也补了,理解差不多都在注释里。

  • F题

       做法,玩一下n=10的样例就出来啦!

  解释:显然a^x的反函数为logax,我们先固定外层的求和的a,然后看内层求和的b,b从a开始加到n,注意到对于后半个向上取整的logba,b>=a,所以始终都是1,而对于前半个式子,只有当b经过a^i时才增加,举个例子就是log22~log23向下取整都为1,log24~log27向下取整都为2,log28~log210都为3.

对于n=10的样例,a=2就可以这样玩出来,在玩a=3,同理,b从3~10的过程中,9和10的时候出来2。

而对于4和4以后的值,我们发现后面求和的值都是n-i+1个1,就是从i到n中有多少个数,这部分我们就可以用公式算。咋算呢?

Σi(n-i+1),显然 i 从sqrt(n)+1到n,把这个式子拆开来,就可以得到公式,此处注意 12+22+……+n2=n*(n+1)*(2n+1)/6;

至此,我们就可以发现规律了!n最大到1e12,我们就可以对前sqrt(n)个数暴力的去算。后面部分的完美地去用公式算。

不过比赛的时候,取模写炸了,导致10几分钟就推出来的结论,爆炸搞了2个小时,取模要每步取模,由于这里的n本身就很大,每个数本身都要取模,而更重要的是对于除法,取模意义下要用逆元来算,所以就用到了快速幂来求除法逆元。主要是这里除法经常炸,亏我对拍debug了半天。

代码:

  1. #include <bits/stdc++.h>
  2. #define debug(x) cout << #x << ": " << x << endl
  3. using namespace std;
  4. typedef long long ll;
  5. const int MAXN=2e5+;
  6. const int INF=0x3f3f3f3f;
  7. const int MOD=;
  8.  
  9. ll quick(ll x,ll n) //快速幂 x^n
  10. {
  11. ll res=;
  12. while(n)
  13. {
  14. if(n&) res=(res*x)%MOD;
  15. x=(x*x)%MOD;
  16. n>>=;
  17. }
  18. return res;
  19. }
  20.  
  21. ll inv(ll a) //逆元 费马小定理,要求 a,mod互素
  22. {
  23. return quick(a,MOD-);
  24. }
  25.  
  26. ll i2sum(ll i)
  27. {
  28. return (((i%MOD)*((i+)%MOD))%MOD*(((*i)%MOD+)%MOD))%MOD*inv()%MOD;
  29. }
  30.  
  31. int main()
  32. {
  33. ios::sync_with_stdio(false);
  34. cin.tie();
  35. ll n;
  36. cin>>n;
  37. ll ans=;
  38. ll k=(ll)sqrt(n)+;
  39. //debug(k);
  40. for(ll i=;i<k;++i)
  41. {
  42. ll t=i;
  43. ll q=;
  44. while(t<=n)
  45. {
  46. q=(q+n-t+)%MOD;
  47. t*=i;
  48. }
  49. ans=(ans+(q%MOD)*(i%MOD)%MOD)%MOD;
  50. //debug(ans);
  51. }
  52. //debug(ans);
  53. ans=(ans+(((((n+)%MOD)*((n-k+)%MOD))%MOD*(((k+n)%MOD)*inv()%MOD)%MOD)%MOD+i2sum(k-)-i2sum(n)+MOD)%MOD)%MOD;
  54. // debug(ans);
  55. //ll t=i2sum(n);
  56. //debug(t);
  57. cout<<ans<<endl;
  58. return ;
  59. }
  60. //200 1366404
  61. //1000 167464908
  62. //10000 36893337
  63. //100000 384927495
  64. //1000000 960529847
  65. //10000000 679483439
  66. //100000000 498142384

debug和对拍数据没删,也可以对照一下。

  • G题

g题一开始看题目看傻了,p是啥完全不知道,后来和队长讨论了一下,结合样例一看,就对上感觉了。

因为操作就是乘2到10之间的一个数,很显然pm | n 且  不pm+1 | n  的m 就是你已经对p乘的操作,需要对照样例感觉一下。

然后维护四棵 区间加法,维护最大值的线段树了。

然后对于2~10的数你可以写if else ,也可以像我这样写,每次差几个log级update的操作问题不大。

然后这两天的数据结构和计算几何题,告诉我这类题一定要scanf,printf,开优化的cin也不行!!!

然后就没啦!(cry!

  1. #include <bits/stdc++.h>
  2. #define debug(x) cout << #x << ": " << x << endl
  3. #define lson (rt<<1)
  4. #define rson (rt<<1|1)
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8. const int MAXN=2e5+;
  9. const int INF=0x3f3f3f3f;
  10. const int MOD=1e9+;
  11. int prime[]={,,,};
  12.  
  13. struct tree
  14. {
  15. int seg[MAXN<<];
  16. int lazy[MAXN<<];
  17. inline void pushup(int rt){ seg[rt]=max(seg[lson],seg[rson]); }
  18. inline void pushdown(int rt)
  19. {
  20. if(lazy[rt])
  21. {
  22. lazy[lson]+=lazy[rt];
  23. lazy[rson]+=lazy[rt];
  24. seg[lson]+=lazy[rt];
  25. seg[rson]+=lazy[rt];
  26. lazy[rt]=;
  27. }
  28. }
  29. void build(int l,int r,int rt)
  30. {
  31. seg[rt]=lazy[rt]=;
  32. if(l==r) {seg[rt]=;return;}
  33. int m=(l+r)>>;
  34. build(l,m,lson);
  35. build(m+,r,rson);
  36. pushup(rt);
  37. }
  38.  
  39. void update(int l,int r,int rt,int ql,int qr,ll x)
  40. {
  41. if(ql<=l && r<=qr) {seg[rt]+=x;lazy[rt]+=x;return;}
  42. pushdown(rt);
  43. int m=(l+r)>>;
  44. if(ql<=m) update(l,m,lson,ql,qr,x);
  45. if(qr>m) update(m+,r,rson,ql,qr,x);
  46. pushup(rt);
  47. }
  48.  
  49. int query(int l,int r,int rt,int ql,int qr)
  50. {
  51. if(ql<=l && r<=qr) return seg[rt];
  52. pushdown(rt);
  53. int m=(l+r)>>;
  54. int ans=-INF;
  55. if(ql<=m) ans=max(ans,query(l,m,lson,ql,qr));
  56. if(qr>m) ans=max(ans,query(m+,r,rson,ql,qr));
  57. return ans;
  58. }
  59. }t[];
  60.  
  61. int main()
  62. {
  63. int n,q;
  64. scanf("%d%d",&n,&q);
  65. //for(int i=0;i<4;++i) t[i].build(1,n,1);
  66. while(q--)
  67. {
  68. char s[];
  69. scanf("%s",s);
  70. int a,b,x;
  71. if(s[]=='U')
  72. {
  73. scanf("%d%d%d",&a,&b,&x);
  74. for(int i=;i<;++i)
  75. {
  76. int tt=;
  77. while(x%prime[i]==)
  78. {
  79. x/=prime[i];
  80. tt++;
  81. }
  82. //debug(tt);
  83. if(tt!=) t[i].update(,n,,a,b,tt);
  84. if(x==) break;
  85. }
  86. }
  87. else
  88. {
  89. scanf("%d%d",&a,&b);
  90. int ans[];
  91. for(int i=;i<;++i)
  92. {
  93. ans[i]=t[i].query(,n,,a,b);
  94. //debug(ans[i]);
  95. }
  96. int a1=max(ans[],ans[]),a2=max(ans[],ans[]);
  97. printf("ANSWER %d\n",max(a1,a2));
  98. }
  99. }
  100. return ;
  101. }
  • I题

2~62任意进制的转换,poj1220

代码来源于大神,看了有些时间才差不多理解。

原来的代码是利用字符ASCII码直接映射的,我自己写的建立了两个互相的映射map,感觉也挺好用的。

转换的核心过程见注释代码。

  1. #include <bits/stdc++.h>
  2. #define debug(x) cout<< # x <<": "<<x<<endl
  3. using namespace std;
  4. const int MAXN=1e3+;
  5.  
  6. map<char,int> mp;
  7. map<int,char> mp2;
  8.  
  9. void init()
  10. {
  11. int k=;
  12. char c;
  13. for(int i=;i<;++i) //0~9
  14. {
  15. c=i;
  16. mp2[k]=c;
  17. mp[c]=k++;
  18. }
  19. for(int i=;i<+;++i) //A~Z
  20. {
  21. c=i;
  22. mp2[k]=c;
  23. mp[c]=k++;
  24. }
  25. for(int i=;i<+;++i) //a~z
  26. {
  27. c=i;
  28. mp2[k]=c;
  29. mp[c]=k++;
  30. }
  31. }
  32. int n,m;
  33. char s[MAXN],ans[MAXN];
  34. int t[MAXN],a[MAXN];
  35.  
  36. void solve()
  37. {
  38. int len=strlen(s),k=;
  39. for(int i=len-;i>=;--i)
  40. {
  41. t[len-i-]=mp[s[i]]; //倒置 得到每位的值 下标0表示低位
  42. }
  43. for(k;len;) //模拟 除m取余 的过程 一次得到低位的一个数
  44. {
  45. for(int i=len-;i>=;--i) //
  46. {
  47. t[i-]+=t[i]%m*n;
  48. t[i]/=m;
  49. }
  50. a[k++]=t[]%m;
  51. t[]/=m;
  52. while(len && !t[len-]) //当前高位已为0,可以减少总位数
  53. len--;
  54. }
  55. ans[k]='\0';
  56. for(int i=;i<k;++i)
  57. {
  58. ans[k-i-]=mp2[a[i]]; //数是从下标0开始的,需要倒置
  59. }
  60. }
  61. int main()
  62. {
  63. ios::sync_with_stdio(false);
  64. cin.tie();
  65. init();
  66. cin>>n>>m;
  67. cin>>s;
  68. solve();
  69. cout<<ans<<endl;
  70. return ;
  71. }

2019icpc银川站 复现赛的更多相关文章

  1. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  2. 2016ACM/ICPC亚洲区沈阳站-重现赛赛题

    今天做的沈阳站重现赛,自己还是太水,只做出两道签到题,另外两道看懂题意了,但是也没能做出来. 1. Thickest Burger Time Limit: 2000/1000 MS (Java/Oth ...

  3. 2013ACM/ICPC亚洲区南京站现场赛---Poor Warehouse Keeper(贪心)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4803 Problem Description Jenny is a warehouse keeper. ...

  4. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  5. 2016ACM/ICPC亚洲区大连站现场赛题解报告(转)

    http://blog.csdn.net/queuelovestack/article/details/53055418 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原 ...

  6. HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    Rabbits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  7. HDU 6225.Little Boxes-大数加法 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

  8. 2019浙师大校赛(浙大命题)(upc复现赛)总结

    2019浙师大校赛(浙大命题)(upc复现赛)总结 早上九点开始.起得迟了,吃了早饭慌慌张张跑过去,刚到比赛就开始了. 开始分别从前往后和从后往前看题,一开始A题,第一发WA,第二次读题发现漏看了还有 ...

  9. 2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组

    2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组 [Problem Description] ​ 给你一个\([1,n]\)的排列,查询\([l,r]\)区间内有多少对 ...

随机推荐

  1. php 开山篇

    由韩顺平老师讲解的 php课程体系 初级课程只能是静态页面开发,不能动态的使用,只是一个界面 学完之后脑海中 应该有的体系~

  2. 基于Quartz.NET框架的任务计划管理工具

    最近接到一个小需求 ——可以定期同步20个Sql Server 7.0数据库里的数据(数据量会预计>10000),并保存为CSV格式文件 ——可以设置保存文件数据量 ——该应用需要用WinFor ...

  3. Erlang/Elixir精选-第2期(20191209)

    Spot The Discrepancies with Dialyzer for Erlang. 如何在大型Erlang项目中从零开始一步步践行Dialyzer. Which companies ar ...

  4. 大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#

    关于昨天的文章 今天有朋友反馈,代码运行的时候,selenium提示警告 DeprecationWarning: use options instead of chrome_options drive ...

  5. CAS都不了解,你还怎么看J.U.C

    前言 说到CAS(CompareAndSwap),不得不先说一说悲观锁和乐观锁,因为CAS是乐观锁思想的一种实现. 悲观锁:总是很悲观的认为,每次拿数据都会有其他线程并发执行,所以每次都会进行加锁,用 ...

  6. 客户端加载文本数据到mysql数据库表(数据导入和导出)

    load data local infile "文件绝对路径" into table 表名; 如果指定了LOCAL,则文件会被客户主机上的客户端读取,并被发送到服务器 如果要导出表 ...

  7. 二叉树的建立&&前中后遍历(递归实现)&&层次遍历

    下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...

  8. luogu P2860 [USACO06JAN]冗余路径Redundant Paths |Tarjan

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  9. 《手把手教你》系列进阶篇之3-python+ selenium自动化测试 - python几种骚操作你都知道吗?(详细教程)

    1. 简介 这篇文章主要是给小伙伴或者童鞋们介绍和分享 python几种骚操:读取配置文件.获取根目录的相对路径.获取系统时间和格式化时间显示.字符串切割等等操作.为后边的自动化框架打下一个结实的基础 ...

  10. 自然语言处理(NLP)相关学习资料/资源

    自然语言处理(NLP)相关学习资料/资源 1. 书籍推荐 自然语言处理 统计自然语言处理(第2版) 作者:宗成庆 出版社:清华大学出版社:出版年:2013:页数:570 内容简介:系统地描述了神经网络 ...