EOJ Monthly 2019.2 题解(B、D、F)
EOJ Monthly 2019.2 题解(B、D、F)
官方题解:https://acm.ecnu.edu.cn/blog/entry/320/
单测试点时限: 2.0 秒
内存限制: 1024 MB
“我把房门上锁,并非为了不让她进去,而是为了防止自己逃到她身边”。
她又被数学难住了。QQ 小方当然是不会对女生说”不”的。
她的数学题是这样的,她得到了一个十进制大整数,这个大整数只包含 1 - 9 这 9 个数字。
现在,要求选出其中连续的一段数字,把其他未被选中的数字全部变成 0,并且使得变换以后的大整数恰好是 m 的倍数。
QQ 小方为了表现自己的能力,所以一口答应给她写出在所有可能的数里面最小的一个。
但是她的问题太多了,她对于这一个大整数,需要对于 q 个不尽相同的 m 分别给出答案。
但是 QQ 小方自己不会。只能来求助你了,你能帮他解答吗?
输入
第一行包含一个大整数,这个整数的位数为 n (1≤n≤106)。
第二行一个整数 q (1≤q≤500) 代表询问次数。
对于每一个询问,包含一行一个整数,表示第 i 次询问的 mi (1≤mi≤5×107)。
保证
≤5×107 。
输出
对于每一个询问输出两个整数 l,r 表示保留第 l 到第 r 位。保证一定有解。
样例
1249
4
7
3
2
83
3 4
4 4
3 3
2 4
提示
对于样例:
1249 这个数中,可选出的最小的7的倍数是49,最小的3的倍数是9,2的倍数是40,83的倍数是249。
题解:
对于该题,很明显可以想到对于所有的可能的解一定可以写成:ai - aj 的形式,设 ai 是从第 i 位到末位代表的整数。
n是一个大整数,显然ai 不能完全表示具体的数,而若ai - aj ≡0(mod m)可以得出ai % m = aj % m,而如何让这个答案ai - aj 最小呢?就要使得ai 越小,aj 越大就好,就是i越靠近后面,j是从末尾到i的所有a[j]中最靠近i的,显然a[j]要从最后面一位+1开始枚举,因为比如说答案是最后一位,那么i=len(整个长度),j=len+1,所以i要从len开始往前枚举,j再从len+1枚举到i+1。
这就是大概的思路,然后,如果像上述的方法去做,时间就变成了预处理len次,枚举len2 ,时间就变成了o(len+len2),len就是n,n最多为1e6,显然会超时。
其实对于mod m,根据鸽巢原理(抽屉原理),你最多枚举m+1次我就能找到两个相同的a[i]和a[j],然后找a[i]和a[j] 时,我们可以这样,先从a[len+1]开始往前枚举,如果枚举到某个a[i],发现这个数已经出现过了,那么这就是我们想要的答案,这样你在找可以边找处理a[i],就可以边找答案,最多处理m+1次,这样就不会超时。具体看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
const int maxm=5e7+;
int n,m,t;
char s[maxn];
int a[maxn];
struct node{
int num;
int have;
}vis[maxm];
int main(){
int len=;
char c;
while(c=getchar()){
if(c>='' && c<='') s[len++]=c;
else{
s[len]='\0';
break;
}
}
len--;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
for(int i=; i<=m; i++){
vis[i].num=;
vis[i].have=;
}
a[len+]=;
vis[a[len+]].num=len+;
vis[a[len+]].have=;
int tmp=;
for(int i=len; i>&&i>=len-m; i--){
a[i]=((s[i]-'')*tmp+a[i+])%m;
tmp=(tmp*)%m;
if(vis[a[i]].have==){
vis[a[i]].num=i;
vis[a[i]].have=;
}
else{
printf("%d %d\n",i,vis[a[i]].num-);
break;
}
}
}
}
单测试点时限: 2.0 秒
内存限制: 256 MB
“他觉得一个人奋斗更轻松自在。跟没有干劲的人在一起厮混,只会徒增压力。”
QQ 小方决定一个人研究研究进制转换。
很快,QQ 小方就遇到问题了。他现在想知道在十进制范围 [l,r] 内有多少整数满足在 k 进制下末尾恰好有 m 个 0。
比如在十进制下的 24 在二进制下是 11000,我们称十进制下的 24 在二进制下末尾恰好有 3 个 0。
QQ 小方一筹莫展,你能帮他解决问题吗?
输入
第一行包含一个整数 T (1≤T≤105) 表示数据组数。
对于每组数据包含一行,四个整数 l,r,k,m ( 1≤l≤r≤1018, 2≤k,m≤100),含义如题目所述。
输出
对于每组数据输出一行,包含一个整数,表示答案。
样例
2
1 10 2 3
1 100 2 3
1
6
提示
例如,在 100 进制下,末位是 90 的数不算作有末尾 0。
#include<bits/stdc++.h>
using namespace std;
typedef long long llx;
llx t,l,r,k,m;
int main(){
cin>>t;
while(t--){
cin>>l>>r>>k>>m;
l--;
llx ll=l,rr=r;
for(llx i=; i<m; i++){
rr=(llx)(rr/k);
ll=(llx)(ll/k);
}
llx rrr=(llx)(rr/k);
llx lll=(llx)(ll/k);
cout<<rr-ll-rrr+lll<<endl;
}
}
单测试点时限: 2.0 秒
内存限制: 256 MB
“放弃不难,但坚持一定很酷。”
QQ 小方已经在体育馆苦练一天射箭了,但他还在坚持。
QQ 小方每天都要在朋友圈晒自己的训练记录。他一共进行了 n 次射箭,成绩分别是 x1,x2,⋯,xn。为了表现自己的发挥十分稳定,QQ 小方决定选出其中的 m 次成绩,使得他们的方差是所有可以选择的方案中最小的。
对于 m 个元素组成的数列 a1,a2,⋯,am,我们知道他们的方差 σ2=(a1−a¯)2+(a2−a¯)2+⋯+(am−a¯)2m ,其中 a¯=a1+a2+⋯+amm。
但是这个问题对 QQ 小方来说太难了,你需要去帮助 QQ 小方。
为了方便,现在你需要输出这个最小的 σ2 乘以 m2 以后的结果。
输入
输入一行包含两个正整数 n (1≤n≤106) 和 m (1≤m≤n)。接下来一行包含 n 个整数 x1,x2,⋯,xn (1≤xi≤103)。
输出
输出一行包含一个整数,表示答案。为了方便,我们需要输出最小的 σ2 乘以 m2 以后的结果。
样例
5 3
1 2 3 4 5
6
题解:
这题就是公式的变形

(=_=)直接看上面的题解吧,注意用long long。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e6+;
ll a[maxn],sum1[maxn],sum2[maxn];
int main(){
ll n,m;
scanf("%lld %lld",&n,&m);
for(ll i=; i<=n; i++) scanf("%lld",&a[i]);
sort(a+,a+n+);
for(ll i=; i<=n; i++){
sum1[i]=sum1[i-]+a[i];
sum2[i]=sum2[i-]+a[i]*a[i];
}
ll minn=LONG_LONG_MAX;
for(ll i=m; i<=n; i++){
ll tmp=(sum2[i]-sum2[i-m])*m-(sum1[i]-sum1[i-m])*(sum1[i]-sum1[i-m]);
minn=min(minn,tmp);
}
printf("%lld\n",minn);
}
EOJ Monthly 2019.2 题解(B、D、F)的更多相关文章
- EOJ Monthly 2019.2 (based on February Selection) F.方差
题目链接: https://acm.ecnu.edu.cn/contest/140/problem/F/ 题目: 思路: 因为方差是用来评估数据的离散程度的,因此最优的m个数一定是排序后连续的,所以我 ...
- EOJ Monthly 2019.2
题解 A 回收卫星 #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/s ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- eoj monthly 2019.11
原题 T1 纸条 题目大意: 给出一个长度为n的字符串,其中m位未知,对于每一位未知的字母,有k个备选字母,最终答案为备选字母按字典序排序后的第x个. 题解: 签到题-- 按照题目意思直接写就可以了. ...
- EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这 ...
- EOJ Monthly 2019.2 (based on February Selection) D.进制转换
题目链接: https://acm.ecnu.edu.cn/contest/140/problem/D/ 题目: 思路: 我们知道一个数在某一个进制k下末尾零的个数x就是这个数整除kx,这题要求刚好末 ...
- EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】
任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...
- EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 【数学+暴力+multiset】
传送门:https://acm.ecnu.edu.cn/contest/126/ C. 唐纳德先生与这真的是签到题吗 单测试点时限: 6.0 秒 内存限制: 1024 MB 唐纳德先生在出月赛的过程中 ...
- EOJ Monthly 2019.3 A
A. 钝角三角形 单点时限: 3.0 sec 内存限制: 512 MB QQ 小方以前不会判断钝角三角形,现在他会了,所以他急切的想教会你. 如果三角形的三边长分别为 a, b, c (a≤b≤c), ...
随机推荐
- (2)OSi模型
osi七层模型 #(应用层,表示层,会话层) => 应用层 => 表达一个数据信息 # 传输层 port(端口) tcp/udp协议 硬件设备:四层交换机 四层路由器 # 网络层 ip协议 ...
- primer3批量设计引物
核心程序调用 Primer3_core,基本用法: primer3_core [ -format_output ] [ -default_version=1|-default_version=2 ] ...
- 'ascii' codec can't decode byte 0xe5 in position 10: ordinal not in range(128)
python2.7 向Excel中写入数据中含有中文就一直报错 'ascii' codec can't decode byte 0xe5 in position 10: ordinal not in ...
- jquery tab切换
首先引入jquery.js <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 解决angular ui-grid 中添加input date修改日期
需求:在angular ui-grid列表中添加一个日期组件来修改时间. 在angular ui-grid添加了一个html5 date input,后端返回的数据是YYYY-MM-DD,比如:201 ...
- python 数据分析基础
安装Python基础的几个数据分析库: pip install pandas pip install numpy pip install scipy pip install scikit-surpri ...
- PAT 1152 Google Recruitment
1152 Google Recruitment (20 分) In July 2004, Google posted on a giant billboard along Highway 101 ...
- 原生js封装插件
https://www.jianshu.com/p/937c6003851a object-fit: cover:https://www.jianshu.com/p/a2ce70fa9584 flex ...
- linux常用命令 命令管道符
多命令顺序执行 多命令顺序执行 多命令执行符 格式 作用 : 命令1:命令2 多个命令顺序执行,命令之间没有任何逻辑联系 && 命令1&&命令2 逻辑与 当命令1正确执 ...
- web程序顺序
1.org.apache.catalina.core.AprLifecycleListener init 2.Apache Tomcat Native library which allows opt ...