2019icpc银川站 复现赛

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

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

  • 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+7;
 6 const int INF=0x3f3f3f3f;
 7 const int MOD=998244353;
 8
 9
10 ll quick(ll x,ll n)  //快速幂 x^n
11 {
12     ll res=1;
13     while(n)
14     {
15         if(n&1) res=(res*x)%MOD;
16         x=(x*x)%MOD;
17         n>>=1;
18     }
19     return res;
20 }
21
22 ll inv(ll a)   //逆元  费马小定理,要求 a,mod互素
23 {
24     return quick(a,MOD-2);
25 }
26
27 ll i2sum(ll i)
28 {
29     return (((i%MOD)*((i+1)%MOD))%MOD*(((2*i)%MOD+1)%MOD))%MOD*inv(6)%MOD;
30 }
31
32
33 int main()
34 {
35     ios::sync_with_stdio(false);
36     cin.tie(0);
37     ll n;
38     cin>>n;
39     ll ans=0;
40     ll k=(ll)sqrt(n)+1;
41     //debug(k);
42     for(ll i=2;i<k;++i)
43     {
44         ll t=i;
45         ll q=0;
46         while(t<=n)
47         {
48             q=(q+n-t+1)%MOD;
49             t*=i;
50         }
51         ans=(ans+(q%MOD)*(i%MOD)%MOD)%MOD;
52         //debug(ans);
53     }
54     //debug(ans);
55     ans=(ans+(((((n+1)%MOD)*((n-k+1)%MOD))%MOD*(((k+n)%MOD)*inv(2)%MOD)%MOD)%MOD+i2sum(k-1)-i2sum(n)+MOD)%MOD)%MOD;
56    // debug(ans);
57     //ll t=i2sum(n);
58     //debug(t);
59     cout<<ans<<endl;
60     return 0;
61 }
62 //200 1366404
63 //1000 167464908
64 //10000 36893337
65 //100000 384927495
66 //1000000 960529847
67 //10000000 679483439
68 //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+7;
  9 const int INF=0x3f3f3f3f;
 10 const int MOD=1e9+7;
 11 int prime[4]={2,3,5,7};
 12
 13 struct tree
 14 {
 15     int seg[MAXN<<2];
 16     int lazy[MAXN<<2];
 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]=0;
 27         }
 28     }
 29     void build(int l,int r,int rt)
 30     {
 31         seg[rt]=lazy[rt]=0;
 32         if(l==r) {seg[rt]=0;return;}
 33         int m=(l+r)>>1;
 34         build(l,m,lson);
 35         build(m+1,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)>>1;
 44         if(ql<=m) update(l,m,lson,ql,qr,x);
 45         if(qr>m) update(m+1,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)>>1;
 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+1,r,rson,ql,qr));
 57         return ans;
 58     }
 59 }t[4];
 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[10];
 69         scanf("%s",s);
 70         int a,b,x;
 71         if(s[1]==‘U‘)
 72         {
 73             scanf("%d%d%d",&a,&b,&x);
 74             for(int i=0;i<4;++i)
 75             {
 76                 int tt=0;
 77                 while(x%prime[i]==0)
 78                 {
 79                     x/=prime[i];
 80                     tt++;
 81                 }
 82                 //debug(tt);
 83                 if(tt!=0) t[i].update(1,n,1,a,b,tt);
 84                 if(x==1) break;
 85             }
 86         }
 87         else
 88         {
 89             scanf("%d%d",&a,&b);
 90             int ans[4];
 91             for(int i=0;i<4;++i)
 92             {
 93                 ans[i]=t[i].query(1,n,1,a,b);
 94                 //debug(ans[i]);
 95             }
 96             int a1=max(ans[0],ans[1]),a2=max(ans[2],ans[3]);
 97             printf("ANSWER %d\n",max(a1,a2));
 98         }
 99     }
100     return 0;
101 }

原文地址:https://www.cnblogs.com/Zzqf/p/11968351.html

时间: 2024-08-30 18:22:31

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

2019ICPC银川站 后记

考量到银川赛区的综合因素,赛前给队友立下flag 所以说啊 我们前四场都喊着保银争金,结果差一点金了,这场喊着保金冲出线,结果差一点出线了(雾) 事实上从正式赛来看,本场也确实是我队建队以来发挥的最好,合作的最默契的现场赛了,自从上场哈尔滨去世导致我队被银牌四杀之后,我们就一直试图从队内配合,队内交流,现场赛环境差异来寻找问题,在总结了很多次之后,本场比赛,至少我们没有犯下肉眼可见的大错误--除了A题最后题意交流出错,但我们当时似乎也没有想到A题的正解 Day0: 队友叫我一起下棋,下了几把发现

hdu5512 Pagodas(2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学) )

Pagodas Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 14 Accepted Submission(s): 13 Problem Description n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai M

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

整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 2304    Accepted Submission(s): 818 Problem Description Little boxes on the hillside.Little boxes made of ticky-tacky.Littl

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

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

2019ICPC徐州站M题

前天在复现赛开M自闭两天,全网找不到题解,后来偶遇cometoj群中的Acmer帮我解决困惑,在此匿名感谢qq名称为不好好学习不改名同学,以下思路均由他提供,也希望为后来人提供一定的思路和想法 题解: 首先很容易看出这是道求树的重心的问题,但是由于他要求所有子树的重心,所以暴力求解会超时,因此我们需要进行剪枝,剪枝需要几点性质 1.两个树合并之后树的重心在之前两棵树重心的连线路径上. 2.如果子树的节点数大于父树节点树的一半,那么父树重心可以由该子树转移而来,因为重心的意义就是代表除去该点后最大

2019icpc银川网络赛-A Maximum(思维)

题目链接:https://nanti.jisuanke.com/t/41285 题意:维护一个栈,支持入栈和出栈操作,并计算每次操作后的栈中最大值,得到最终结果. 思路: 外面吵得风生水起,我校平静地在打比赛,丝毫不知道这次比赛的题目就是把2018银川邀请赛的题照搬过来了QAQ,主办方真牛逼.. 这题真的是,我和hxc轮流做这道题,被坑惨了,一直以为使用数据结构来做,没想到点上去.思维题,每次保证栈顶为栈中最大元素.如果当前入栈的元素为x,当前栈顶元素为y,如果x>=y,这个没问题,直接入栈就行

2018 CCPC 桂林站(upc复现赛)总结

比赛一开始盯上了A题和G题,一个小时过去了还没有出题,心里有些乱.这时我看D题很多人过了,于是宝儿去看D题,说D题简单,转化成二进制暴力,于是就去做了.写的时候好像思路有点卡,WA了一发,后来马上发现问题就A了:这时大概快2个小时了.看了一眼榜单,发现除了D以外,G,H,J做的人最多:然后去看了H和J的题目,H是一道有关字符串的模拟,J是一道博弈的题目.H一开始感觉很简单,敲完后发现L随手写的样例过不去,然后越想越发现要考虑的情况很多,就先搁置继续考虑G了:J题一开始漏看了句子读错了题意,等到还

2019ICPC西安邀请赛(计蒜客复现赛)总结

开始时因为吃饭晚了一刻钟,然后打开比赛.看了眼榜单A题已经过了二十来个队伍了,宝儿就去做A. 传师说最后一题看题目像最短路,于是我就去看M了,宝儿做完之后也来陪我看.M一开始看到时以为是像   POJ的Frogger   一样,求S 到T 的路径中的最小距离最大值.后来发现对路径中走过的边数也有限制.于是又去想,然后想到把原本记录到此点最短距离的Dis[] 变成 记录到达此点所需要飞行器最低等级的Dis_Level[],这样剩下的就是普通的Dijkstra了.做完M之后比赛进行了大概一个半小时.

2018 ACM-ICPC 青岛站现场赛总结

埋怨运气是没有用的 不够努力才是原罪 选择了这条路后的第二次写总结(也是第二次比较大型的赛事叭).写之前回顾了一下第一次的总结,庆幸自己在这半年内有所长进.博弈已经有了一些水题的积累,KMP.组合数学也见识了一些题目并补充了一些拓展算法.莫比乌斯反演.杜教筛等一些数学方面的知识也得到了补充和加强,数论之外的算法也有了更全面的认识.总而言之,也不算辜负那句"To make each day count". 比赛的结果不尽人意.感觉就是自己给自己铺了路,走的时候又被自己放置的石头所绊倒.自