首页 > 其他分享 >2023.1.7(Atcoder Beginner Contest 284)

2023.1.7(Atcoder Beginner Contest 284)

时间:2023-01-08 01:55:05浏览次数:67  
标签:Atcoder Hash int ll 2023.1 mp c2 c1 284

A.Happy New Year 2023

https://atcoder.jp/contests/abc284/tasks/abc284_d

Statement

将给定的 \(N\) 分解成 \(N = p ^ 2 \cdot q\) 的形式,其中 \(p, q\) 为两个不相同的质数 \((1 \leq N \leq 9 \cdot 10 ^{18})\)。

Solution

由于 \(N\) 很大,可以使用时间复杂度较优的 Pollard’s rho 算法。

也可以观察到,\(min(p, q)\)是 \(\sqrt[3]{n}\) 级别的。因此我们可以枚举这个值 \(x\),判断它是否可以作为 \(p\) 或 \(q\)。 可以作为 \(p\) 的条件是 \(n \% (x * x) =0\) ,可以作为 \(q\) 的条件是 \(n \% x = 0\) 且 \(\frac {n} {x}\) 是完全平方数。

Code

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

int T;
ll n;

bool issquare(ll x) { return (ll)sqrt(x) == sqrt(x); }

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    freopen("in","r", stdin);
    cin >> T;
    while (T--) {
        cin >> n;
        for (ll i = 2; i * i * i <= n; i++) {
            if (n % i == 0 && issquare(n / i)) {
                cout << (ll)sqrt(n / i) << " " << i << endl;
                break;
            }
            if (n % (i * i) == 0) {
                cout << i << " " << n / i / i << endl;
                break;
            }
        }
    }
	return 0;
}

B.Count Simple Paths

https://atcoder.jp/contests/abc284/tasks/abc284_e

Statement

给定一个 \(n\) 个点 \(m\) 条边的无向图,保证每个点的度数在 \(10\) 以内,求出从 \(1\) 号节点为起点的所有简单路径的个数。(若个数大于 \(10^6\) 则输出 \(10^6\))。

Solution

朴素想法是直接对图进行dfs遍历。关键点是题目中对于度数的限制。有了这个限制,可以保证“在搜索的过程中不会因为进入一个不优的节点而需要耗费相当多的代价再走回来”。因此时间复杂度是正确的。

C.ABCBAC

https://atcoder.jp/contests/abc284/tasks/abc284_f

Statement

对于一个长度为 \(n\) 的字符串 \(S\),通过\(f_i(S)\) 构造出一个长度为 \(2n\) 的字符串 \(T\)。

\(f_i(S)\) : \(S\) 的前 \(i\) 个字母 + \(S\) 的倒序字符串 + \(S\)的后 \(n - i\) 个字母。

现给出 \(n\) 和 \(T\),询问是否能得到一组可行的 \(S\) 和 \(i\)。有解则输出方案。

Solution

枚举 \(i\),同时结合字符串双哈希即可。

Code

#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
const int N = 2e6 + 5;
typedef long long ll;
using namespace std;

int n;
string t;

//Double Hash Model
typedef pair<int, int> Hash;
const ll mod1 = 1e9 + 7;
const ll mod2 = 1e9 + 9;

Hash operator + (Hash a, Hash b) {
    int c1 = a.fi + b.fi, c2 = a.se + b.se;
    if (c1 >= mod1) c1 -= mod1;
    if (c2 >= mod2) c2 -= mod2;
    return mp(c1, c2);
}

Hash operator - (Hash a, Hash b) {
    int c1 = a.fi - b.fi, c2 = a.se - b.se;
    if (c1 < 0) c1 += mod1;
    if (c2 < 0) c2 += mod2;
    return mp(c1, c2);
}

Hash operator * (Hash a, Hash b) {
    int c1 = 1ll * a.fi * b.fi % mod1, c2 = 1ll * a.se * b.se % mod2;
    return mp(c1, c2);
}

Hash pw[N], pre[N], suf[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    freopen("in","r", stdin);
    cin >> n >> t;
    n *= 2;
    Hash base = mp(13331, 23333);
    pw[0] = mp(1, 1);
    for (int i = 1; i <= n; i++) {
        pw[i] = pw[i - 1] * base;
        pre[i] = pre[i - 1] * base + mp(t[i - 1], t[i - 1]);
    }
    for (int i = n; i >= 1; i--) suf[i] = suf[i + 1] * base + mp(t[i - 1], t[i - 1]);
    for (int i = 0; i <= n / 2; i++) {
        Hash res1 = (pre[i] * pw[n / 2 - i]) + (pre[n] - pre[i + n / 2] * pw[n / 2 - i]);
        Hash res2 = suf[i + 1] - suf[i + 1 + n / 2] * pw[n / 2];
        if (res1 == res2) {
            cout << t.substr(0, i) + t.substr(i + n / 2, n - i) << endl;
            cout << i << endl;
            return 0;
        }
    }
    cout << "-1" << endl;
	return 0;
}

标签:Atcoder,Hash,int,ll,2023.1,mp,c2,c1,284
From: https://www.cnblogs.com/BeyondLimits/p/17034007.html

相关文章

  • Atcoder ABC 284题解
    DHappyNewYear2023(枚举,时间复杂度计算)题意​ 给定\(n\\le\9\times10^{18}\),给出式子\(n=p^2\timesq\),该式子必定有解且有唯一解。请输出\(p\)和\(q\)......
  • Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
    题目链接弱化版(其实完全一样)u1s1,洛谷上这题的第一个题解写得很不错,可以参考直接边讲Polya定理边做这题问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色,如果两......
  • Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
    题目链接弱化版(其实完全一样)u1s1,洛谷上这题的第一个题解写得很不错,可以参考直接边讲Polya定理边做这题问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色,如果两......
  • Atcoder Beginner Contest 284总结
    前言第一次做出6道题。比赛过程A题白给,耗时\(\text{1min}\)。B题白给,然而突然忘了oddnumber是奇数还是偶数,于是翻译了一下。耗时\(\text{2mins}\)。C题直接......
  • AtCoder Beginner Contest 284
    A-SequenceofStrings(abc284a)题目大意顺序给定\(n\)个字符串,倒着顺序输出。解题思路模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;u......
  • 三目运算符——the fifteenth——2023.1.6
    三目运算符表达式1?表达式2:表达式3;意思是:先执行表达式1,如果表达式1的结果为真,则执行表达式2,结果就是表达式2的结果;如果表达式1的结果为假,则执行表达式3,结果为表达3的结......
  • E - Don't Isolate Elements -- ATCODER
    E-Don'tIsolateElementshttps://atcoder.jp/contests/abc283/tasks/abc283_e 思路 参考https://www.cnblogs.com/cilinmengye/p/17008799.html ......
  • 2023.1.7 DP 学习日志
    上午编辑距离(AcWing.899)思路:同最短编辑距离,只不过要做\(m\)次。code:#include<bits/stdc++.h>#definelllonglong#defineN1005usingnamespacestd;inlinel......
  • 2023.1.7学习笔记
    、经典类与新式类经典类:​不继承object的类或者其子类的类新式类:​继承object或者其之类的类​在python3中,只有新式类,所有类都默认继承object​在python2中,区......
  • AtCoder Beginner Contest 257 题解
    AtCoderBeginnerContest257Solution目录AtCoderBeginnerContest257Solution更好的阅读体验戳此进入题面链接题面Luogu链接abc跳了[ABC257D]JumpingTakahashi......