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

这里补一下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了半天。

代码:

 #include <bits/stdc++.h>
#define debug(x) cout << #x << ": " << x << endl
using namespace std;
typedef long long ll;
const int MAXN=2e5+;
const int INF=0x3f3f3f3f;
const int MOD=; ll quick(ll x,ll n) //快速幂 x^n
{
ll res=;
while(n)
{
if(n&) res=(res*x)%MOD;
x=(x*x)%MOD;
n>>=;
}
return res;
} ll inv(ll a) //逆元 费马小定理,要求 a,mod互素
{
return quick(a,MOD-);
} ll i2sum(ll i)
{
return (((i%MOD)*((i+)%MOD))%MOD*(((*i)%MOD+)%MOD))%MOD*inv()%MOD;
} int main()
{
ios::sync_with_stdio(false);
cin.tie();
ll n;
cin>>n;
ll ans=;
ll k=(ll)sqrt(n)+;
//debug(k);
for(ll i=;i<k;++i)
{
ll t=i;
ll q=;
while(t<=n)
{
q=(q+n-t+)%MOD;
t*=i;
}
ans=(ans+(q%MOD)*(i%MOD)%MOD)%MOD;
//debug(ans);
}
//debug(ans);
ans=(ans+(((((n+)%MOD)*((n-k+)%MOD))%MOD*(((k+n)%MOD)*inv()%MOD)%MOD)%MOD+i2sum(k-)-i2sum(n)+MOD)%MOD)%MOD;
// debug(ans);
//ll t=i2sum(n);
//debug(t);
cout<<ans<<endl;
return ;
}
//200 1366404
//1000 167464908
//10000 36893337
//100000 384927495
//1000000 960529847
//10000000 679483439
//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!

 #include <bits/stdc++.h>
#define debug(x) cout << #x << ": " << x << endl
#define lson (rt<<1)
#define rson (rt<<1|1) using namespace std;
typedef long long ll;
const int MAXN=2e5+;
const int INF=0x3f3f3f3f;
const int MOD=1e9+;
int prime[]={,,,}; struct tree
{
int seg[MAXN<<];
int lazy[MAXN<<];
inline void pushup(int rt){ seg[rt]=max(seg[lson],seg[rson]); }
inline void pushdown(int rt)
{
if(lazy[rt])
{
lazy[lson]+=lazy[rt];
lazy[rson]+=lazy[rt];
seg[lson]+=lazy[rt];
seg[rson]+=lazy[rt];
lazy[rt]=;
}
}
void build(int l,int r,int rt)
{
seg[rt]=lazy[rt]=;
if(l==r) {seg[rt]=;return;}
int m=(l+r)>>;
build(l,m,lson);
build(m+,r,rson);
pushup(rt);
} void update(int l,int r,int rt,int ql,int qr,ll x)
{
if(ql<=l && r<=qr) {seg[rt]+=x;lazy[rt]+=x;return;}
pushdown(rt);
int m=(l+r)>>;
if(ql<=m) update(l,m,lson,ql,qr,x);
if(qr>m) update(m+,r,rson,ql,qr,x);
pushup(rt);
} int query(int l,int r,int rt,int ql,int qr)
{
if(ql<=l && r<=qr) return seg[rt];
pushdown(rt);
int m=(l+r)>>;
int ans=-INF;
if(ql<=m) ans=max(ans,query(l,m,lson,ql,qr));
if(qr>m) ans=max(ans,query(m+,r,rson,ql,qr));
return ans;
}
}t[]; int main()
{
int n,q;
scanf("%d%d",&n,&q);
//for(int i=0;i<4;++i) t[i].build(1,n,1);
while(q--)
{
char s[];
scanf("%s",s);
int a,b,x;
if(s[]=='U')
{
scanf("%d%d%d",&a,&b,&x);
for(int i=;i<;++i)
{
int tt=;
while(x%prime[i]==)
{
x/=prime[i];
tt++;
}
//debug(tt);
if(tt!=) t[i].update(,n,,a,b,tt);
if(x==) break;
}
}
else
{
scanf("%d%d",&a,&b);
int ans[];
for(int i=;i<;++i)
{
ans[i]=t[i].query(,n,,a,b);
//debug(ans[i]);
}
int a1=max(ans[],ans[]),a2=max(ans[],ans[]);
printf("ANSWER %d\n",max(a1,a2));
}
}
return ;
}
  • I题

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

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

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

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

 #include <bits/stdc++.h>
#define debug(x) cout<< # x <<": "<<x<<endl
using namespace std;
const int MAXN=1e3+; map<char,int> mp;
map<int,char> mp2; void init()
{
int k=;
char c;
for(int i=;i<;++i) //0~9
{
c=i;
mp2[k]=c;
mp[c]=k++;
}
for(int i=;i<+;++i) //A~Z
{
c=i;
mp2[k]=c;
mp[c]=k++;
}
for(int i=;i<+;++i) //a~z
{
c=i;
mp2[k]=c;
mp[c]=k++;
}
}
int n,m;
char s[MAXN],ans[MAXN];
int t[MAXN],a[MAXN]; void solve()
{
int len=strlen(s),k=;
for(int i=len-;i>=;--i)
{
t[len-i-]=mp[s[i]]; //倒置 得到每位的值 下标0表示低位
}
for(k;len;) //模拟 除m取余 的过程 一次得到低位的一个数
{
for(int i=len-;i>=;--i) //
{
t[i-]+=t[i]%m*n;
t[i]/=m;
}
a[k++]=t[]%m;
t[]/=m;
while(len && !t[len-]) //当前高位已为0,可以减少总位数
len--;
}
ans[k]='\0';
for(int i=;i<k;++i)
{
ans[k-i-]=mp2[a[i]]; //数是从下标0开始的,需要倒置
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
init();
cin>>n>>m;
cin>>s;
solve();
cout<<ans<<endl;
return ;
}

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. CCNA 之 五 路由协议 一 静态路由

    静态路由 路由选择原理 什么是路由? 就如同去某一个地方,会有很多种路线,每一条路线经都可以称之为路由: 路由器中会维护一张路由表,每一个表项都是一条路由,也就是去往某个网络的路径,然后将对应的数据包 ...

  2. c语言基本数据类型short、int、long、char、float、double大小及命名规则

    C 语言包含的数据类型: 一.数据类型与“模子”short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 怎么去理解它们呢? 举个例子:见过藕煤 ...

  3. 使用Navicat连接阿里云服务器中的Mysql数据库

    1.首先将阿里云服务器中的安全组添加上Mysql的端口3306,如下图所示: 步骤就是进入到阿里云的官网,点击右上角控制台,在左边选择云服务器ECS--->实例 点击图中的管理按钮,然后选择本实 ...

  4. 挑战10个最难的Java面试题(附答案)【上】

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),验证通过后,输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动&quo ...

  5. git 使用详解(8)—— 分支HEAD、branch/checkout

    有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将 Git 从版本控制系统家族里区分出来.Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎 ...

  6. [TimLinux] JavaScript 中循环执行和定时执行

    1. 两对函数 // 循环执行 // 在每个毫秒数之后,调用函数 var timeid = window.setInterval(函数名, 毫秒数); window.clearInterval(tim ...

  7. Local Model Poisoning Attacks to Byzantine-Robust Federated Learning

    In federated learning, multiple client devices jointly learn a machine learning model: each client d ...

  8. ARTS-S ISO C

    一些简称 ANSI: American National Standards Institute. ANSI是the International Organization for Standardiz ...

  9. THREE.js 笔记

    1.加载3d模型,obj格式,方式一: 加载obj,自行指定material贴图:方式二: 同时加载obj和mtl,此时为了正确加载贴图,最好指定统一的baseUrl: 2.canvas.toData ...

  10. 通信协议TLV的介绍及在python下的代码实现及仿真

    TLV协议是一种通讯协议,一般将数据封装成TLV的形式,即Tag,Length,Value.协议就是指通信双方对数据传输控制的一种规定,规定了数据格式,同步方式,传送速度,传送步骤的问题作出统一的规定 ...