2022 icpc杭州站 A. Modulo Ruins the Legend

2022 icpc杭州站 A. Modulo Ruins the Legend

Problem - A - Codeforces

在这里插入图片描述

思路

题目可以转换为求 ( s ⋅ n + d t ⋅ n ( n + 1 ) 2 + s u m ) % m ( 1 ) (s \cdot n + d_t \cdot \frac{n(n + 1)}{2} + sum) \% m (1) (sn+dt2n(n+1)+sum)%m1 的最小值

d = g c d ( n , n ( n + 1 ) 2 ) d = gcd(n,\frac{n(n + 1)}{2}) d=gcd(n,2n(n+1))

于是 ( 1 ) (1) 1 转换为
( k ⋅ d + s u m ) % m = ( k ⋅ d % m + s u m % m ) % m = ( k ⋅ d + t ⋅ m + s u m % m ) % m g = g c d ( d , m ) , k ⋅ d + t ⋅ m = z ⋅ g ,   s u m 2 = s u m % m = ( z ⋅ g + s u m 2 ) % m \begin{aligned}(k \cdot d + sum) \% m &= (k\cdot d \%m + sum \%m) \%m \\&=(k\cdot d + t\cdot m + sum \%m) \%m \\&g = gcd(d, m), k\cdot d + t\cdot m = z\cdot g, \ sum_2 = sum \% m\\&=(z \cdot g + sum_2) \% m\end{aligned} (kd+sum)%m=(kd%m+sum%m)%m=(kd+tm+sum%m)%mg=gcd(d,m),kd+tm=zg, sum2=sum%m=(zg+sum2)%m
因为 g ≤ m , s u m 2 < m g \le m, sum_2 < m gm,sum2<m, 所以 z ⋅ g ≥ m − s u m 2 z \cdot g \ge m - sum_2 zgmsum2 时候能得到最小值, z = ⌈ m − s u m 2 g ⌉ z = \lceil \frac{m - sum_2}{g} \rceil z=gmsum2

证明:

z ⋅ g + s u m 2 < m z\cdot g + sum_2 < m zg+sum2<m 时, ( z ⋅ g + s u m 2 ) % m (z \cdot g + sum_2) \% m (zg+sum2)%m 中最小都会有一个 g g g

z ⋅ g + s u m 2 > m z\cdot g + sum_2 > m zg+sum2>m 时, ( z ⋅ g + s u m 2 ) % m (z \cdot g + sum_2) \% m (zg+sum2)%m 最小值能够小于 g g g

求出 z 之后,再一步一步的代回去,用 exgcd 求出 s , d t s, d_t s,dt 即可

最小值就是 z ⋅ g + s u m 2 − m z\cdot g + sum_2 - m zg+sum2m

#include <bits/stdc++.h>
#define endl "\n"
#define INF 0x3f3f3f3f
#define LLINF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

ll exgcd(ll a, ll b, ll& x, ll& y) {
    if (!b) {
        x = 1, y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, x, y);
    ll tx = x;
    x = y, y = tx - y * (a / b);
    return d;
}

signed main() {
    IOS;
    ll n, mod; cin >> n >> mod;
    ll sum = 0;
    for (int i = 1; i <= n; i++) {
        ll t; cin >> t;
        sum += t;
    }

    ll a = n, b = n * (n + 1) / 2;
    ll s, dt;
    ll d = exgcd(a, b, s, dt);
    sum %= mod;

    ll k, t;
    ll g = exgcd(d, mod, k, t);

    ll z = (mod - sum + g - 1) / g;
    (k *= z) %= mod;
    
    s = ((s % mod * k) % mod + mod) % mod, dt = ((dt % mod * k) % mod + mod) % mod;

    cout << (z * g + sum - mod) << endl;
    cout << s << " " << dt << endl;
}
内容概要:本文档是详尽的 Android SDK 中文帮助文档,介绍了 Android SDK 的核心概念、组件、开发环境搭建、基础开发流程及常用工具使用指南。首先解释了 Android SDK 的定义及其核心价值,即提供标准化开发环境,使开发者能高效构建、测试、优化 Android 应用。接着详细列出了 SDK 的核心组件,包括 Android Studio、SDK Tools、Platform Tools、Build Tools、Android 平台版本和系统镜像。随后,文档提供了详细的环境搭建步骤,适用于 Windows、macOS 和 Linux 系统,并介绍了基础开发流程,以“Hello World”为例展示了从创建项目到运行应用的全过程。此外,还深入讲解了 ADB、AVD Manager 和 SDK Manager 等核心工具的功能和使用方法。最后,文档涵盖了调试与优化工具(如 Logcat、Profiler 和 Layout Inspector)、关键开发技巧(如多版本 SDK 兼容、Jetpack 库的使用和资源文件管理)以及常见问题的解决方案。 适合群:具有初步编程知识,希望深入了解 Android 应用开发的开发者,尤其是新手开发者和有一定经验但需要系统化学习 Android SDK 的技术员。 使用场景及目标:①帮助开发者快速搭建 Android 开发环境;②指导开发者完成基础应用开发,理解核心工具的使用;③提高开发效率,掌握调试与优化技巧;④解决常见开发过程中遇到的问题。 阅读建议:此文档内容全面且实用,建议读者按照章节顺序逐步学习,结合实际开发项目进行练习,尤其要注意动手实践环境搭建和基础开发流程,同时参考提供的扩展学习资源,进一步提升开发技能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值