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=1x∑j=1y[⌊ji⌋==i mod j].
x , y ≤ 1 0 9 x,y \leq 10^9 x,y≤109.
题目思路:
题解思路没太看懂。我的思路比较复杂。。
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=⌊ji⌋∗j+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=d∗j+d.
一种朴素的求法就是从1开始枚举 d d d,直到 d ∗ j + d ≤ x d*j+d \leq x d∗j+d≤x.
但是我们也可以直接求, 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) 1≤d≤min(⌊j+1x⌋,j−1)
所以 f ( j ) = m i n ( j − 1 , ⌊ x j + 1 ⌋ ) f(j)=min(j-1,\lfloor\frac{x}{j+1}\rfloor) f(j)=min(j−1,⌊j+1x⌋)
所以可以分成两种情况分别处理:
当 j − 1 < ⌊ x j + 1 ⌋ j-1 < \lfloor\frac{x}{j+1}\rfloor j−1<⌊j+1x⌋时,我们发现 j j j的取值不超过 x \sqrt{x} x.那么这个部分暴力枚举即可。
当 j − 1 ≥ ⌊ x j + 1 ⌋ j-1 \geq \lfloor\frac{x}{j+1}\rfloor j−1≥⌊j+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=ry⌊j+1x⌋=∑j=r+1y+1⌊jx⌋.
这个部分我们类似整数分块的思路二分求解即可。
整体时间复杂度: O ( T x l o g x ) O( T\sqrt{x}log{\sqrt{x}}) O(Txlogx).
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使得:
- b i , j ≤ 1 e 6 b_{i,j} \leq 1e6 bi,j≤1e6
- a i , j ∣ b i , j a_{i,j}|b_{i,j} ai,j∣bi,j
- 所有与 b i , j b_{i,j} bi,j相邻的数和它绝对值的差值都是 k 4 k^4 k4.
注:条件三中k不是固定的。
n
,
m
≤
500
n,m \leq 500
n,m≤500
1
≤
a
i
,
j
≤
16
1 \leq a_{i,j} \leq 16
1≤ai,j≤16
题目思路:
让每个格子的数都相等.那么这个数就是 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