2018 计蒜之道 初赛 第五场

这次的比赛没有现场打,而是等到了今天才来补。

主要是因为那时候和HHHOJ上的比赛冲突了,所以就没写。

这次前三题的难度都比较低,但是就是一个T4要莫比乌斯反演。又是不可食用的。

好了我们开始看题。

A. 贝壳找房搬家

这道题刚开始看的时候没看懂题意,觉得T1就是这种立体几何的题目,有种想的感觉。

因为我认为这个方块可以不规则地想怎么放就怎么放的,其实题目中有一句话:

我们可以把这堆箱子看成一个\(x \times y \times z\) 的长方体。

什么?刚开始只能是长方体吗?好吧好像还是不可做的样子。

然后一看时限:5000ms,那不就……暴力一下?

我们枚举最短边\(a(1<=a<=\sqrt[3]n)\),然后是次短边\(b(1<=b<=\sqrt n)\)。

然后我们只需要算出第三边\(h(h为整数)\),然后讨论一下谁是长,谁是宽,谁是高。

然后直接更新最大最小值即可。注意这里长宽都是原来+2的结果,但高是+1。

CODE

#include<cstdio>
using namespace std;
int t,n,h,v,MAX,MIN;
inline char tc(void)
{
    static char fl[100000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
    x=0; char ch=tc();
    while (ch<‘0‘||ch>‘9‘) ch=tc();
    while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=tc();
}
inline void write(int x)
{
    if (x/10) write(x/10);
    putchar(x%10+‘0‘);
}
inline int min(int a,int b)
{
    return a<b?a:b;
}
inline int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
    register int a,b; read(t);
    while (t--)
    {
        read(n); MAX=-1; MIN=1e9;
        for (a=1;a*a*a<=n;++a)
        for (b=1;b*b<=n;++b)
        {
            if (n%(a*b)) continue; h=n/a/b;
            MIN=min(MIN,(a+2)*(b+2)*(h+1)-n); MAX=max(MAX,(a+2)*(b+2)*(h+1)-n);
            MIN=min(MIN,(a+2)*(b+1)*(h+2)-n); MAX=max(MAX,(a+2)*(b+1)*(h+2)-n);
            MIN=min(MIN,(a+1)*(b+2)*(h+2)-n); MAX=max(MAX,(a+1)*(b+2)*(h+2)-n);
        }
        write(MIN); putchar(‘ ‘); write(MAX); putchar(‘\n‘);
    }
    return 0;
}

B. 贝壳找房算数(简单)

这还是比较水的,直接\(O(n^2logn)\)判断即可。

因为分解以及gcd都是log的,所以不会超时。

CODE

#include<cstdio>
using namespace std;
int n,a,b,ans;
long long k;
inline int f(int x)
{
    int tot=1;
    while (x) tot*=x%10,x/=10;
    return tot;
}
inline int gcd(int m,int n)
{
    return n?gcd(n,m%n):m;
}
int main()
{
    register int i,j; scanf("%d%lld",&n,&k);
    for (i=1;i<=n;++i)
    for (j=1;j<=n;++j)
    {
        int a=f(i),b=f(j);
        if (!a||!b) continue;
        if (gcd(a,b)<=k) ++ans;
    }
    printf("%d",ans);
    return 0;
}

C. 贝壳找房算数(中等)

这个也是很Easy的,因为我们注意到像124,142和241等等这些数它们的贡献是一样的。

因此我们发现有用的\(f(i)\)很少,所以我们统计一下所有\(f(i)=x\)的数分别有多少。

这里由于数的分布不均匀,因此我们上map大法

这里主意一下对于map的遍历,需要用指针和一个奇奇怪怪的STL来完成

这遍历非人哉,我才不会告诉你我是从网上找的方法

CODE

#include<cstdio>
#include<map>
using namespace std;
const int mod=998244353;
map <int,int> t;
map <int,int>::iterator a,b;
int n,w;
long long k,ans;
inline int f(int x)
{
    int tot=1;
    while (x) tot*=x%10,x/=10;
    return tot;
}
inline int gcd(int m,int n)
{
    return n?gcd(n,m%n):m;
}
int main()
{
    register int i; scanf("%d%lld",&n,&k);
    for (i=1;i<=n;++i)
    ++t[f(i)];
    for (a=t.begin();a!=t.end();++a)
    for (b=a;b!=t.end();++b)
    {
        int x1=a->first,y1=a->second,x2=b->first,y2=b->second;
        if (!x1||!x2) continue;
        if (gcd(x1,x2)>k) continue;
        if (x1^x2) ans=(ans+(long long)y1*y2*2)%mod; else ans=(ans+y1*y2)%mod;
    }
    printf("%lld",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/cjjsb/p/9130281.html

时间: 2024-08-27 06:25:21

2018 计蒜之道 初赛 第五场的相关文章

2017 计蒜之道 初赛 第五场 UCloud 的安全秘钥(中等)

每个 UCloud 用户会构造一个由数字序列组成的秘钥,用于对服务器进行各种操作.作为一家安全可信的云计算平台,秘钥的安全性至关重要.因此,UCloud 每年会对用户的秘钥进行安全性评估,具体的评估方法如下: 首先,定义两个由数字序列组成的秘钥 aa 和 bb近似匹配(\approx≈) 的关系.aa 和 bb 近似匹配当且仅当同时满足以下两个条件: |a|=|b|∣a∣=∣b∣,即 aa 串和 bb 串长度相等. 对于每种数字 cc,cc 在 aa 中出现的次数等于cc 在 bb 中出现的次数

2017 计蒜之道 初赛 第五场 D. UCloud 的安全秘钥(困难)

小数据打表,大数据暴力. 导致超时的主要原因是$m$小的询问次数太多,可以把$m≤10$的答案直接暴力打表存起来,$m>10$的用$C$题的方法即可. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #in

2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)

暴力. 暴力枚举$S$串的每一个长度为$m$的子串,排序判断即可. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #inc

2017 计蒜之道 初赛 第五场 C. UCloud 的安全秘钥(中等)

暴力. $O(m*n)$的算法可以通过此题,每次询问$O(m)$扫S数组,统计不同数字的个数,每次移动最多只会变化两个数字,如果不同数字个数为$0$,那么答案加$1$. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue&g

2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建

贪心. 从大到小排序之后进行模拟,注意$n=1$和$n=0$的情况. #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <map> #in

2018 计蒜之道 初赛 第三场

A. 贝壳找房性价比 题解:按s排序后,斜率最大的点必定在相邻的两点之间. #pragma warning(disable:4996) #include<queue> #include<map> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #de

2018 计蒜之道 初赛 第一场

百度无人车 二分 #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn = 2e4 + 10; LL a[maxn]; int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%lld", a + i); LL p, s; scanf("

2018 计蒜之道 初赛 第二场

签到完看到C没什么人过就溜乐. A.淘宝的推荐系统 直接DP,时间复杂度$O(∑nd)$ #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) #define MP make_pair #define fi first #define se s

计蒜之道 初赛 第三场 题解

腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这其中有的信号的作用范围近,有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在任何一个方向上信号强度都一致的. 已知用户面向北方拿着自己的手机,在不同方位的各种信号覆盖区域可以被抽象成以用户为圆心的一系列扇形.已知每个扇形的半径 r,和每个扇形的两条边相对于正东方向的夹角度数.每个信号覆盖区域抽象出的扇形都可以通过从第一条边逆时针旋转到第二条边画出. <img src="http://res.ji