最后一轮的 2017 Google APAC Test 了呢。

scoreboard中搜索hdu.toraoh,可以看我的当时实际提交情况。

照惯例,题意就不翻译了。(毕竟Google有英文面试的)

本文URLhttp://blog.csdn.net/fcxxzux/article/details/53055195,转载请留地址(而且现在还没完工呢)

A. Diwali lightings

显然要利用这个模式串s很短,查询区间很长。
我们知道查询区间里s完整地出现几次,再补上最开头s的末尾一部分,再补上最后s的开头一部分,这3部分的B的数量之和,完事。

能写起来更简单吗?
对于这种求[a,b][a,b]之间满足一定条件的东西的数目的题目,我们可以做以下的转化:
[a,b]的答案=[1,b]的答案−[1,a]的答案[a,b]的答案=[1,b]的答案-[1,a]的答案
而[1,a]的答案,在处理的时候,就没有要补上s尾部一块的问题了。
(所以我就是这么写的)

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;char s[105];
ll a,b;ll cnt(ll x){int len=strlen(s);ll d=x/len,mod=x%len;ll ans=0;for(int i=0;i<len;i++){if(s[i]=='B'){ans+=d;if(i<mod)ans+=1;}}return ans;
}int main(){freopen("A-large.in","r",stdin);freopen("A-large.out","w",stdout);int T,Case=1;for(scanf("%d",&T);Case<=T;Case++){scanf("%s%I64d%I64d",s,&a,&b);printf("Case #%d: %I64d\n",Case,cnt(b)-cnt(a-1));}return 0;
}

B. Beautiful Numbers

考虑做的方向:
先进制再确定长度?
不行,进制可行解多,范围极大,还不连续,没法直接二分进制求得答案。

那先确定长度再考虑几进制?
因为2^64>10^18,2进制下都不可能长度超过64位,好像可行。
那怎么确定是几进制的呢?
A、二分,不是超了就是少了,或者刚好,还是单调变化,非常好
B、为什么不直接开根号呢?
对输入的nn,从最长的长度xx枚举,直接开(x−1)(x-1)次根号并下取整,然后代回检查。

直接开根号可行的解释的话。
首先,我们要知道,
对bb进制的数(12345)b(12345)_b,转成10进制,要这么算:
1∗b4+2∗b3+3∗b2+4∗b1+5∗b01*b^4+2*b^3+3*b^2+4*b^1+5*b^0
然后反证法:
假设长度x的情况下,开根号,告诉你应该是b进制

先证明不可能是b-1进制
b-1进制的情况下,这个数如果各个位置全1,转化成10进制,应该是:
1∗(b−1)x−1+⋯+1∗(b−1)3+1∗(b−1)2+1∗(b−1)1+1∗(b−1)01*(b-1)^{x-1}+ \dots +1*(b-1)^3+1*(b-1)^2+1*(b-1)^1+1*(b-1)^0
我们来把bx−1b^{x-1}变形一下:
bx−1b^{x-1}
=((b−1)+1)x−1= ((b-1)+1)^{x-1}
=(x−1x−1)(b−1)x−1+(x−1x−2)(b−1)x−2+…= \binom {x-1}{x-1}(b-1)^{x-1} + \binom {x-1}{x-2}(b-1)^{x-2} + \dots(二项式定理)
>(b−1)x−1+(b−1)x−2+…> (b-1)^{x-1}+(b-1)^{x-2}+\dots
然而事实上,bx−1≤nb^{x-1} \leq n
也就是说,b−1b-1进制再怎么努力也不行。

b+1b+1进制也不可能,很直白地能证明:
我们开根号是n√x−1\sqrt[x-1]{n},一个最高位是1,其他位是0的b+1b+1进制的数,上来就有(b+1)x−1>(n√x−1)x−1(b+1)^{x-1} > (\sqrt[x-1]{n}) ^ {x-1},怎么想都已经虐过那个n了。
或者直接说,开根号和幂次互为逆操作。你开根号的结果再幂回去,一样大。你现在开根号的结果+1再幂回去,肯定大于n了。

所以证明了,⌊n√x−1⌋\lfloor {\sqrt[x-1]{n}} \rfloor 就是我们想要的(进制)。

当然不要忘了,对长度为2的情况,单独抓出来特判。

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;ll lpow(ll base,ll time){ll ans=1;for(int i=1;i<=time;i++)ans*=base;return ans;
}ll check(ll x,int time){ll ans=pow((double)x,1.0/time);if(ans<2)return -1;ll t=0;for(int i=0;i<=time;i++){t+=lpow(ans,i);}if(t!=x)return -1;return ans;
}int main(){freopen("B-large.in","r",stdin);freopen("B-large.out","w",stdout);int T,Case=1;for(scanf("%d",&T);Case<=T;Case++){ll n;scanf("%I64d",&n);for(int i=64;i>=1;i--){if(i==1){printf("Case #%d: %I64d\n",Case,n-1);break;}ll res=check(n,i);if(res>0){printf("Case #%d: %I64d\n",Case,res);break;}}}return 0;
}

C. Partioning Number

不妨看成3段:
a0,a0+1,a0+2a_0, a_0+1 , a_0+2 3种东西
搞x,y,zx,y,z个,使得x∗a0+y∗(a0+1)+z∗(a0+2)=nx*a_0+y*(a_0+1)+z*(a_0+2) = n,而且a0|da_0 | d

方法1:
枚举a0a_0,以及到底由几种不同的数组成
1种:直接来,整除检查就行
2种:或者没yy,得x∗a0+z∗(a0+2)=nx*a_0+z*(a_0+2) = n,或者没zz,得x∗a0+y∗(a0+1)=nx*a_0+y*(a_0+1) = n
3种:枚举x,然后剩下的方程是y∗(a0+1)+z∗(a0+2)=n−x∗a0y*(a_0+1)+z*(a_0+2)=n-x*a_0

3种二元一次不定方程,求不定方程的整数解的个数的话

掏出扩展欧几里得算法来算吧!
具体可参考欧几里德与扩展欧几里德算法 - jumping_frog - 博客园 的说明,相关细节摘抄如下:

对于不定整数方程 pa + qb = c,若 c mod gcd(a, b) = 0,则该方程存在整数解,否则不存在整数解。(注:以a b c为已知量)
上面已经列出找p * a + q * b = gcd(a, b)一个整数解的方法(扩展欧几里得算法直接求,额外的2个返回值就是p0和q0,我们要的整数解)
在找到p * a+q * b = gcd(a, b)的一组解p0,q0后,
可以得到p * a+q * b = c的一组解
p1 = p0 * ( c / gcd(a,b) ),
q1 = q0 * ( c / gcd(a,b) ),

p * a+q * b = c的其他整数解满足:
p = p1 + b / gcd(a, b) * t
q = q1 - a / gcd(a, b) * t(其中t为任意整数)
p 、q就是p * a+q * b = c的所有整数解。
相关证明可参考:
http://www.cnblogs.com/void/archive/2011/04/18/2020357.html

然后,我们要求p>0且q>0,可以得到t的取值范围,
t>−p1∗gcd(a,b)/bt > -p1 * gcd(a,b) / b
t<q1∗gcd(a,b)/at
其中为整数的t的数量,就是这个二元一次不定方程的正整数解的数量了!

时间复杂度?
外层O(n),最内部求解的数量是O(logn)的
中间枚举y∗(a0+1)+z∗(a0+2)=n−x∗a0y*(a_0+1)+z*(a_0+2)=n-x*a_0的时间复杂度呢?
注意到,这里面每层要枚举的数量累加起来为:
n/1+n/2+n/3+⋯+n/nn/1+n/2+n/3+\dots+n/n
=nlogn=nlogn (调和级数)
所以,我们的时间复杂度为O(nlog2n)O(nlog^2n)

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;void extgcd(ll a,ll b,ll& d,ll& x,ll& y){if(!b){d=a;x=1;y=0;}else{extgcd(b,a%b,d,y,x);y-=x*(a/b);}
}int solve(int a,int b,int n){if(n%__gcd(a,b)!=0)return 0;ll g,p0,q0;extgcd(a,b,g,p0,q0);p0*=n/g;q0*=n/g;int less=floor((-p0)*g*1.0/b),great=floor(q0*g*1.0/a);if(q0*g%a==0)--great;return great-less<0?0:great-less;
}int main(){freopen("C-large.in","r",stdin);freopen("C-large3.out","w",stdout);int T,Case=1;for(scanf("%d",&T);Case<=T;Case++){int n,d;ll ans=0;scanf("%d%d",&n,&d);if(n%d==0)ans++;for(int i0=d;i0*2<=n;i0+=d){//1if(n%i0==0)++ans;//2ans+=solve(i0,i0+1,n);ans+=solve(i0,i0+2,n);//3for(int i=1;i0*i<n;i++){ans+=solve(i0+1,i0+2,n-i0*i);}}printf("Case #%d: %I64d\n",Case,ans);}return 0;
}

跑完大数据,大约5~10秒。

解法2:by [zucc]ChouUn
(我是真没搞懂,估计是开始的思路就不一样了……
在这里贴一下他的说明和代码)

直接当做3元1次不定方程:
ax+(a+1)y+(a+2)z=n−a…(1)ax+(a+1)y+(a+2)z=n-a \dots(1)
x+y+z=m−1………………(2)x+y+z=m-1\dots\dots\dots\dots\dots\dots(2)
(其中我们枚举aa和mm)
(1)−a∗(2)(1)-a*(2)得
y+2z=(n−a)−a(m−1)y+2z=(n-a)-a(m-1)
并且补充限制条件y+z≤m−1y+z \leq m-1
然后画图,可以发现: y+2zy+2z 跟 y+zy+z 交点是整点,
不用考虑太多,继续数学一下过了

(这个出解很快,真 · O(nlogn)O(nlogn))

D. Sorting Array

目前并不会做(说实话,题都还没读)
有空补上。

【在线笔试题解题报告系列】Google APAC 2017 University Test Round E相关推荐

  1. 【在线笔试题解题报告系列】网易2017校招内推笔试之编程题【持续更新】

    网易今年把内推笔试放在牛客网上办,然后出了一批编程题. 题目在: http://www.nowcoder.com/test/2252286/summary http://www.nowcoder.co ...

  2. 【在线笔试题解题报告系列】Google APAC 2017 University Test Round B

    这场和上场相比,不是代码傻乎乎堆就能多拿分了.想清楚再动手最最最重要. scoreboard中搜索hdu.toraoh,可以看我的当时实际提交情况. 照惯例,题意就不翻译了,这种英文阅读应该是能搞掂的 ...

  3. 【在线笔试题解题报告系列】Indeed Tokyo 2017校园招聘 在线测试3(时间:2016.07.09)

    --这个在线测试赛后不可练习,题目也看不了了,但是代码我都好好的留下来了 先上提交记录: 之后从前往后复述题意,写题解吧. 本文地址:http://blog.csdn.net/fcxxzux/arti ...

  4. 阿里巴巴历年在线笔试题汇总

    阿里巴巴在线笔试题汇总 2013阿里巴巴前端在线笔试题 1.现有代码如下: 2.如果你现在使用的是 Google Chrome 或 Apple Safari,如何让 input 元素在默认情况下显示 ...

  5. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  6. 【前端】2015阿里前端实习生在线笔试题

    网上找的题,自己做了做. ... 2015阿里巴巴前端实习生在线笔试题 1. (单项选择)对于下列程序运行结果,符合预期的是 function f1() { console.time('time sp ...

  7. 2016-11-15试题解题报告

    2016-11-15试题解题报告 By shenben T1代码: #include<cstdio> #include<algorithm> using namespace s ...

  8. 2016-11-17试题解题报告

    2016-11-17试题解题报告 By shenben 水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知 ...

  9. 2015某大型电商集团的前端实习生在线笔试题(无耻的拿来偷看了)

    2015某大型电商集团的前端实习生在线笔试题(嘿嘿猜猜是谁的) 1.(单项选择)对于下列程序运行结果,符合预期的是 function f1() { console.time('time span'); ...

最新文章

  1. java线程入门篇(一)
  2. 部署微软lync uc服务器,lync server xxxx企业版前端服务器部署资料.docx
  3. 2021-04-12 电机滑模控制 LuGre摩擦模型
  4. JAVA中怎么设置文本域位置_java – 如何在JTextArea中更改文本的位置
  5. H.264编解码流程
  6. Python实现cmd命令连续执行
  7. Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions发布1.1 CTP版本扩展
  8. LR逻辑斯蒂回归 — 机器学习面试
  9. dubbo指定服务提供者ip_使用指定IP调用Dubbo服务
  10. 脉冲波形对uwb的影响matlab仿真,DS-UWB系统信号的产生及MATLAB仿真
  11. 算法总结之 在数组中找到一个局部最小的位置
  12. mysql时间日期函数
  13. 招投标管理与实务--刘小明老师
  14. 机房空调漏水原因和常用处理方法
  15. 安卓APP中启动微信小程序,闪一下无法打开问题
  16. Java中 DecimalFormat 用法详解
  17. Mapbox GL JS介绍及使用
  18. 邓正平:智能硬件大众化任务交给京东
  19. 毕业设计-图书管理系统
  20. 第八周 oj 1992 分数序列

热门文章

  1. 企业的核心高管团队:CEO、COO、CSO、CTO、CFO、CHO
  2. ruby中gruff画图的简单例子
  3. css卷轴动画小程序,微信小程序动画两种实现方式
  4. ABP VNext系列(一)-第一个ABP VNext
  5. BUUCTF:[HBNIS2018]excel破解
  6. ABP入门教程(三)添加一个领域层和一个应用层
  7. 微信HOOK 协议接口 实战开发篇 3.收发文本消息 附详细步骤
  8. DW网页设计大作业成品品分享,Div+Css,主题如风景、校园、美食、动漫、lol、咖啡...
  9. Mac m2芯片安装虚拟机win11
  10. 恢复华为手机桌面计算机,如何恢复华为手机桌面