Codeforces Round #701 (Div. 2)小结

2023大厂真题提交网址(含题解):

www.CodeFun2000.com(http://101.43.147.120/)

最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练习,体会真题难度。现在OJ已录入50+道2023年最新大厂真题,同时在不断的更新。同时,可以关注"塔子哥学算法"公众号获得每道题的题解。
在这里插入图片描述

前言:

很硬核的一场比赛。我 C C C都磨了一个多小时才出来。让人怀疑人生的是人均会 C C C.数论真的是这么容易嘛?

C.Floor and Mod:思维,数论,整数分块

∑ i = 1 x ∑ j = 1 y [ ⌊ i j ⌋ = = i   m o d   j ] \sum_{i=1}^{x}\sum_{j=1}^{y}[\lfloor\frac{i}{j}\rfloor==i \ mod \ j] i=1xj=1y[⌊ji==i mod j].

x , y ≤ 1 0 9 x,y \leq 10^9 x,y109.

题目思路:

题解思路没太看懂。我的思路比较复杂。。

1.先令 f ( j ) = ∑ i = 1 x [ ⌊ i j ⌋ = = i   m o d   j ] f(j)=\sum_{i=1}^{x}[\lfloor\frac{i}{j}\rfloor==i \ mod \ j] f(j)=i=1x[⌊ji==i mod j].我们的目标要求 ∑ j = 1 y f ( j ) \sum_{j=1}^{y}f(j) j=1yf(j)
2.现在问你,如何 O ( 1 ) O(1) O(1)求特定的 f ( j ) f(j) f(j).

根据带余除法,我们有以下式子:
i = ⌊ i j ⌋ ∗ j + i   m o d   j i=\lfloor\frac{i}{j}\rfloor*j+i \ mod \ j i=jij+i mod j
又因为 ⌊ i j ⌋ = i   m o d   j = d \lfloor\frac{i}{j}\rfloor=i \ mod \ j=d ji=i mod j=d.

所以就是求 i ∈ [ 1 , x ] i \in [1,x] i[1,x]内有多少种可能的取值使得 i = d ∗ j + d i=d*j+d i=dj+d.

一种朴素的求法就是从1开始枚举 d d d,直到 d ∗ j + d ≤ x d*j+d \leq x dj+dx.

但是我们也可以直接求, d ( j + 1 ) ≤ x d(j+1)\leq x d(j+1)x.即 1 ≤ d ≤ m i n ( ⌊ x j + 1 ⌋ , j − 1 ) 1 \leq d \leq min(\lfloor\frac{x}{j+1}\rfloor,j-1) 1dmin(⌊j+1x,j1)

所以 f ( j ) = m i n ( j − 1 , ⌊ x j + 1 ⌋ ) f(j)=min(j-1,\lfloor\frac{x}{j+1}\rfloor) f(j)=min(j1,j+1x⌋)

所以可以分成两种情况分别处理:

j − 1 < ⌊ x j + 1 ⌋ j-1 < \lfloor\frac{x}{j+1}\rfloor j1<j+1x时,我们发现 j j j的取值不超过 x \sqrt{x} x .那么这个部分暴力枚举即可。

j − 1 ≥ ⌊ x j + 1 ⌋ j-1 \geq \lfloor\frac{x}{j+1}\rfloor j1j+1x时,我们可以推出以下式子:

∑ j = r y f ( j ) = ∑ j = r y ⌊ x j + 1 ⌋ = ∑ j = r + 1 y + 1 ⌊ x j ⌋ \sum_{j=r}^{y}f(j)=\sum_{j=r}^{y}\lfloor\frac{x}{j+1}\rfloor=\sum_{j=r+1}^{y+1}\lfloor\frac{x}{j}\rfloor j=ryf(j)=j=ryj+1x=j=r+1y+1jx.

这个部分我们类似整数分块的思路二分求解即可。

整体时间复杂度: O ( T x l o g x ) O( T\sqrt{x}log{\sqrt{x}}) O(Tx logx ).

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
ll calc (ll g , ll up){ return up / (g + 1);}
int main()
{
    ios::sync_with_stdio(false);
    int t; cin >> t;
    while (t--){
        ll x , y ; cin >> x >> y;
        ll ans = 0 , res = 2e9;
        for (ll i = 2 ; i <= y ; i++){
            if ((x / i) <= (i - 1)){
   		        res = i;
	            break;
	         }
	         ans += i - 1}
        for (ll i = res ; i <= y ; ){
            ll now = calc(i , x);
            ll l = i , r = y;
            while (l <= r){
                ll mid = l + r >> 1;
                if (calc(mid , x) == now) l = mid + 1;
                else r = mid - 1;
            }
            ans += (r - i + 1) * now;
            i = r + 1;
        }
        cout << ans << endl;
    }
    return 0;
}

D. Multiples and Power Differences:思维,数论.
题目大意:

给你一个 n , m n,m n,m的二维矩阵 a i , j a_{i,j} ai,j。让你构造出一个矩阵 b i , j b_{i,j} bi,j使得:

  1. b i , j ≤ 1 e 6 b_{i,j} \leq 1e6 bi,j1e6
  2. a i , j ∣ b i , j a_{i,j}|b_{i,j} ai,jbi,j
  3. 所有与 b i , j b_{i,j} bi,j相邻的数和它绝对值的差值都是 k 4 k^4 k4.

注:条件三中k不是固定的。

n , m ≤ 500 n,m \leq 500 n,m500
1 ≤ a i , j ≤ 16 1 \leq a_{i,j} \leq 16 1ai,j16

题目思路:

让每个格子的数都相等.那么这个数就是 l c m { 1 , 2 , . . . , 16 } = 720720 lcm\{1,2,...,16\}=720720 lcm{1,2,...,16}=720720.

黑白染色,对于白色格,填 720720 720720 720720.
对于黑色格子,填 720720 + a i , j 4 720720+a_{i,j}^4 720720+ai,j4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值