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

这里补一下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. 02-kubeadm初始化Kubernetes集群

    目录 部署 组件分布 部署环境 kubeadm 步骤 基础环境 基础配置 安装基础组件 配置yum源 安装组件 初始化 master 导入镜像 执行命令: 查看组件状态 查看node状态 安装flan ...

  2. tcpdump 详解

    目录 简介 安装 参数详解 案例 监听指定主机的数据包 监视指定主机和端口的数据包 监视指定网络的数据包 监视指定协议的数据包 使用tcpdump抓取HTTP包 简介 用简单的话来定义tcpdump, ...

  3. 2. Python环境安装

    Centos 下环境安装 我们通过pyenv来管理python环境,更好的帮助开发者避免在环境上出现各种各样的问题 准备工作 安装之前,确保已经安装了git yum install git -y 安装 ...

  4. Linux进阶文档丨阿里架构师十年Linux心得,全在这份文档里面

    Linux是什么 Linux就是个操作系统: 它和Windows XP.Windows 7.Windows 10什么的一样就是一个操作系统而已! Linux能干什么: 它能当服务器,服务器上安装者各种 ...

  5. .NET进阶篇06-async异步、thread多线程4

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 梯子 一.锁1.lock2.Interlocked3.Monitor4.SpinLock5.Mutex6.Semaphore7.Events1. ...

  6. .Net Core下使用MQTT协议直连IoT平台

    [摘要] .Net平台通过原生MQTT接口,作为南向设备对接OceanConnect平台 因为种种历史原因吧,目前华为平台上对.net的支持案例SDK确实比较少,当看到各种语言的SDK和Demo,唯独 ...

  7. 转:OAuth2 深入介绍

    OAuth2 深入介绍 1. 前言 2. OAuth2 角色 2.1 资源所有者(Resource Owner) 2.2 资源/授权服务器(Resource/Authorization Server) ...

  8. JWT攻击手册:如何入侵你的Token

    JSON Web Token(JWT)对于渗透测试人员而言,可能是一个非常吸引人的攻击途径.因为它不仅可以让你伪造任意用户获得无限的访问权限,而且还可能进一步发现更多的安全漏洞,如信息泄露,越权访问, ...

  9. luogu P1327 数列排序

    题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入格式 第一行,正整数n (n<=10 ...

  10. Rancher1-简单介绍-认识rancher

    认识rancher 一.简介 1.什么rancher Rancher是一个开源软件平台,使组织能够在生产中运行和管理Docker和Kubernetes.使用Rancher,组织不再需要使用一套独特的开 ...