AtCoder Beginner Contest 290(D-F)「数论」「算贡献」「球盒问题」

文章讨论了在编程竞赛中如何运用数论思想解决D-Marking问题,通过分析gcd(A,B)的性质推导出标记模式。接着介绍了E-MakeitPalindrome题目,通过计算贡献来确定构建回文串的最小代价。最后,文章探讨了F-MaximumDiameter问题,利用球盒模型解决最大直径的计算,涉及插板法和同球不同盒的计数策略。

 D - Marking (atcoder.jp)

思路:

数论。

  • 结论:如果存在A=ad,B=bd,gcd(A,B)=d,那么对于每一个 kB mod A(0<=k<=a-1)都是d的倍数且为[ 0 , a-1 ]的一种排列。
  • 证明:kB=kbd,kB mod A = kbd-yad (y=[kB/A]) = (kb-ya)d。
  • 反证法,如果存在iB mod A \equiv jB mod A,则易得ad \mid(i-j)bd,ab互素,则a \mid(i-j),但由于k的取值范围,i-j<=a-1,显然不成立,故不存在重复倍数。
  • kB mod A = kb - [ kb/a ] * a = a ( kb/a - [ kb/a ] ) < a,故范围确定。

在本题中我们可以令D为B,N为A,kD mod N,每a步都不会重复标记,在第a步时 aD mod N=abd mod ad=0,此时向前走一步,继续进行a步标记。

最后结果就是本轮次数(直接算)+轮数(偏移量)。

记得开ll。

#include <bits/stdc++.h>
using namespace std;
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
#define int ll
#define pb push_back
#define eb emplace_back
#define m_p make_pair
#define mod 998244353
#define mem(a,b) memset(a,b,sizeof a)
#define pii pair<int,int>
#define fi first
#define se second
#define inf 0x3f3f3f3f
const int N = 3e5 + 50;
//__builtin_ctzll(x);后导0的个数
//__builtin_popcount计算二进制中1的个数

void work() {
	int n, K, D;
	c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值