题单:https://codeforces.com/problemset/page/6?tags=number%20theory,0-1200
原题指路:https://codeforces.com/problemset/problem/1658/B
定义一个长度为 n n n的排列 p 1 , ⋯ , p n p_1,\cdots,p_n p1,⋯,pn是好的,如果 gcd ( 1 ⋅ p 1 , 2 ⋅ p 2 , ⋯ , n ⋅ p n ) > 1 \gcd(1\cdot p_1,2\cdot p_2,\cdots,n\cdot p_n)>1 gcd(1⋅p1,2⋅p2,⋯,n⋅pn)>1.求 1 ∼ n 1\sim n 1∼n的排列中好的排列的个数,答案对 998244353 998244353 998244353取模.
有 t ( 1 ≤ t ≤ 1000 ) t\ \ (1\leq t\leq 1000) t (1≤t≤1000)组测试数据.每组测试数据输入一个 n ( 1 ≤ n ≤ 1000 ) n\ \ (1\leq n\leq 1000) n (1≤n≤1000).
令 g = gcd ( 1 ⋅ p 1 , 2 ⋅ p 2 , ⋯ , n ⋅ p n ) g=\gcd(1\cdot p_1,2\cdot p_2,\cdots,n\cdot p_n) g=gcd(1⋅p1,2⋅p2,⋯,n⋅pn),则 g ≤ 2 g\leq 2 g≤2.
[证] ①
g
>
2
g>2
g>2时,若
∃
\exists
∃素数
p
>
2
s
.
t
.
p
∣
g
p>2\ s.t.\ p\mid g
p>2 s.t. p∣g,因
1
∼
n
1\sim n
1∼n中有
⌊
n
p
⌋
\left\lfloor\dfrac{n}{p}\right\rfloor
⌊pn⌋个
p
p
p的倍数,则至多能匹配
2
⌊
n
p
⌋
<
n
2\left\lfloor\dfrac{n}{p}\right\rfloor
② g ≤ 2 g\leq 2 g≤2时,可将值为奇数的数放在偶数下标的位置,将值为偶数的数放在奇数下标的位置. 1 ∼ n 1\sim n 1∼n中有 n 2 \dfrac{n}{2} 2n个奇数和 n 2 \dfrac{n}{2} 2n个偶数,故 a n s = [ ( n 2 ) ! ] 2 ans=\left[\left(\dfrac{n}{2}\right)!\right]^2 ans=[(2n)!]2.
const int MAXN = 1005;
const int MOD = 998244353;
int fac[MAXN], ifac[MAXN];
void init() {
fac[0] = 1;
for (int i = 1; i < MAXN; i++) fac[i] = (ll)fac[i - 1] * i % MOD;
ifac[MAXN - 1] = qpow(fac[MAXN - 1], MOD - 2, MOD);
for (int i = MAXN - 1; i; i--) ifac[i - 1] = (ll)ifac[i] * i % MOD;
}
void solve() {
init();
CaseT {
int n; cin >> n;
cout << (n & 1 ? 0 : (ll)fac[n / 2] * fac[n / 2] % MOD) << endl;
}
}
int main() {
solve();
}
原题指路:https://codeforces.com/problemset/problem/1679/A
有A和B两种车,分别有 4 4 4、 6 6 6个轮子.现已知所有车的轮子总数 n n n,求总车数的最小值和最大值,无解输出 − 1 -1 −1.
有 t ( 1 ≤ t ≤ 1000 ) t\ \ (1\leq t\leq 1000) t (1≤t≤1000)组测试数据.每组测试数据第一行输入一个整数 n ( 1 ≤ n ≤ 1 e 18 ) n\ \ (1\leq n\leq 1\mathrm{e}18) n (1≤n≤1e18).
设A、B两种车的数量分别为 x , y x,y x,y,则 4 x + 6 y = n 4x+6y=n 4x+6y=n.
显然 n < 4 n<4 n<4或 n n n是奇数时无解.有解时,方程转化为 2 x + 3 y = n 2 2x+3y=\dfrac{n}{2} 2x+3y=2n.
(1)为使得总车数最小,应让 y y y尽量大.
①若 n 2 ≡ 0 ( m o d 3 ) \dfrac{n}{2}\equiv 0\ \ (\mathrm{mod}\ 3) 2n≡0 (mod 3),显然 a n s = n 3 ans=\dfrac{n}{3} ans=3n.
②若 n 2 ≡ 1 ( m o d 3 ) \dfrac{n}{2}\equiv 1\ \ (\mathrm{mod}\ 3) 2n≡1 (mod 3),可拆成 3 + ⋯ + 3 + 2 + 2 3+\cdots+3+2+2 3+⋯+3+2+2.
③若 n 2 ≡ 2 ( m o d 3 ) \dfrac{n}{2}\equiv 2\ \ (\mathrm{mod}\ 3) 2n≡2 (mod 3),可拆成 3 + ⋯ + 3 + 2 3+\cdots+3+2 3+⋯+3+2.
综上, a n s = ⌈ n 3 ⌉ ans=\left\lceil\dfrac{n}{3}\right\rceil ans=⌈3n⌉.
(2)为使得总车数最大,应让 x x x尽量大.
①若 n 2 ≡ 0 ( m o d 2 ) \dfrac{n}{2}\equiv 0\ \ (\mathrm{mod}\ 2) 2n≡0 (mod 2),显然 a n s = n 2 ans=\dfrac{n}{2} ans=2n.
②若 n 2 ≡ 1 ( m o d 2 ) \dfrac{n}{2}\equiv 1\ \ (\mathrm{mod}\ 2) 2n≡1 (mod 2),可拆成 2 + ⋯ + 2 + 3 2+\cdots+2+3 2+⋯+2+3.
综上, a n s = ⌊ n 2 ⌋ ans=\left\lfloor\dfrac{n}{2}\right\rfloor ans=⌊2n⌋.
void solve() {
ll n; cin >> n;
if (n < 4 || n & 1) {
cout << -1 << endl;
return;
}
else {
n >>= 1;
cout << (n + 2) / 3 << ' ' << n / 2 << endl;
}
}
int main() {
CaseT // 单测时注释掉该行
solve();
}
原题指路:https://codeforces.com/problemset/problem/1712/B
构造一个 1 ∼ n 1\sim n 1∼n的排列 p 1 , ⋯ , p n s . t . l c m ( 1 , p 1 ) + ⋯ + l c m ( n , p n ) p_1,\cdots,p_n\ s.t.\ \mathrm{lcm}(1,p_1)+\cdots+\mathrm{lcm}(n,p_n) p1,⋯,pn s.t. lcm(1,p1)+⋯+lcm(n,pn)最大,若有多组解,输出任一组.
有 t ( 1 ≤ t ≤ 1000 ) t\ \ (1\leq t\leq 1000) t (1≤t≤1000)组测试数据.每组测试数据输入一个整数 n ( 1 ≤ n ≤ 1 e 5 ) n\ \ (1\leq n\leq 1\mathrm{e}5) n (1≤n≤1e5).数据保证所有测试数据的 n n n之和不超过 1 e 5 1\mathrm{e}5 1e5.
最优策略:①若 n n n为偶数,则偶数放奇数位,奇数放偶数位,形如 2 , 1 , 4 , 3 , ⋯ , n , n − 1 2,1,4,3,\cdots,n,n-1 2,1,4,3,⋯,n,n−1;②若 n n n为奇数,则先放将 1 1 1放在第一位,剩下的偶数个数转化为情况①,形如 1 , 3 , 2 , 5 , 4 , ⋯ , n , n − 1 1,3,2,5,4,\cdots,n,n-1 1,3,2,5,4,⋯,n,n−1.
[证] 定义函数
f
(
x
,
y
)
=
{
x
y
,
x
≠
y
x
,
其余情况
f(x,y)=
显然 l c m ( x , y ) ≤ f ( x , y ) \mathrm{lcm}(x,y)\leq f(x,y) lcm(x,y)≤f(x,y),问题转化为求 f ( 1 , p 1 ) + ⋯ + f ( n , p n ) f(1,p_1)+\cdots+f(n,p_n) f(1,p1)+⋯+f(n,pn)的最大值.
考察问题:求 1 ⋅ p 1 + ⋯ + n ⋅ p n 1\cdot p_1+\cdots+n\cdot p_n 1⋅p1+⋯+n⋅pn的最大值,其中 p i ≠ i ( 1 ≤ i ≤ n ) p_i\neq i\ \ (1\leq i\leq n) pi=i (1≤i≤n).
该问题等价于求 f ( 1 , p 1 ) + ⋯ + f ( n , p n ) f(1,p_1)+\cdots+f(n,p_n) f(1,p1)+⋯+f(n,pn)的最大值,因为若存在这样的下标 i i i,可交换 p i p_i pi和 p j ( 1 ≤ j < i ) p_j\ \ (1\leq jpj (1≤j<i).
以排列中的 n n n个元素为节点、以 i → p i i\rightarrow p_i i→pi为边.除 p 1 = 1 p_1=1 p1=1的情况外,其余环的边数至少为 2 2 2.
对一个环 x 1 , ⋯ , x k x_1,\cdots,x_k x1,⋯,xk,若无 p i p_i pi的限制,该环对最大值的贡献为 x 1 2 + ⋯ + x k 2 x_1^2+\cdots+x_k^2 x12+⋯+xk2.
x 1 2 + x 2 2 + ⋯ + x k 2 − ( x 1 x 2 + x 2 x 3 + ⋯ + x k x 1 ) x_1^2+x_2^2+\cdots+x_k^2-(x_1x_2+x_2x_3+\cdots+x_kx_1) x12+x22+⋯+xk2−(x1x2+x2x3+⋯+xkx1)
= x 1 2 2 − x 1 x 2 + x 2 2 2 + x 2 2 2 − x 2 x 3 + x 3 2 2 + ⋯ + x k 2 2 − x k x 1 + x 1 2 2 =\dfrac{x_1^2}{2}-x_1x_2+\dfrac{x_2^2}{2}+\dfrac{x_2^2}{2}-x_2x_3+\dfrac{x_3^2}{2}+\cdots+\dfrac{x_k^2}{2}-x_kx_1+\dfrac{x_1^2}{2} =2x12−x1x2+2x22+2x22−x2x3+2x32+⋯+2xk2−xkx1+2x12
= ( x 1 − x 2 ) 2 + ( x 2 − x 3 ) 2 + ⋯ + ( x k − x 1 ) 2 2 =\dfrac{(x_1-x_2)^2+(x_2-x_3)^2+\cdots+(x_k-x_1)^2}{2} =2(x1−x2)2+(x2−x3)2+⋯+(xk−x1)2
≥ ∣ x 1 − x 2 ∣ + ∣ x 2 − x 3 ∣ + ⋯ + ∣ x k − x 1 ∣ 2 ≥ max { x 1 , ⋯ , x k } − min { x 1 , ⋯ , x k } \geq \dfrac{|x_1-x_2|+|x_2-x_3|+\cdots+|x_k-x_1|}{2}\geq \max\{x_1,\cdots,x_k\}-\min\{x_1,\cdots,x_k\} ≥2∣x1−x2∣+∣x2−x3∣+⋯+∣xk−x1∣≥max{x1,⋯,xk}−min{x1,⋯,xk}.
考虑如何最小化所有环的 max { x 1 , ⋯ , x k } − min { x 1 , ⋯ , x k } \max\{x_1,\cdots,x_k\}-\min\{x_1,\cdots,x_k\} max{x1,⋯,xk}−min{x1,⋯,xk}之和.
(1)若 n n n是偶数,可将相邻两数成环,形如 ( 1 , 2 ) , ( 3 , 4 ) , ⋯ , ( n − 1 , n ) (1,2),(3,4),\cdots,(n-1,n) (1,2),(3,4),⋯,(n−1,n),
此时所有环的 max { x 1 , ⋯ , x k } − min { x 1 , ⋯ , x k } \max\{x_1,\cdots,x_k\}-\min\{x_1,\cdots,x_k\} max{x1,⋯,xk}−min{x1,⋯,xk}之和的最小值为 n 2 \dfrac{n}{2} 2n.
(2)若 n n n是奇数,
①若 p 1 = 1 p_1=1 p1=1,显然最小值为 n − 1 2 < n 2 \dfrac{n-1}{2}<\dfrac{n}{2} 2n−1<2n,比(1)更优.
②若 p 1 ≠ 1 p_1\neq 1 p1=1,显然最小值为 n + 1 2 > n 2 \dfrac{n+1}{2}>\dfrac{n}{2} 2n+1>2n,比(1)更劣.
综上,该构造可使得 f ( 1 , p 1 ) + ⋯ + f ( n , p n ) f(1,p_1)+\cdots+f(n,p_n) f(1,p1)+⋯+f(n,pn)最大,进而使得 l c m ( 1 , p 1 ) + ⋯ + l c m ( n , p n ) \mathrm{lcm}(1,p_1)+\cdots+\mathrm{lcm}(n,p_n) lcm(1,p1)+⋯+lcm(n,pn)最大.
void solve() {
int n; cin >> n;
if (n & 1) {
cout << 1 << ' ';
for (int i = 2; i <= n; i += 2) cout << i + 1 << ' ' << i << ' ';
cout << endl;
}
else {
for (int i = 1; i <= n; i += 2) cout << i + 1 << ' ' << i << ' ';
cout << endl;
}
}
int main() {
CaseT // 单测时注释掉该行
solve();
}
原题指路:https://codeforces.com/problemset/problem/1717/A
给定一个正整数 n n n,有多少对 ( a , b ) ( 1 ≤ a , b ≤ n ) s . t . l c m ( a , b ) gcd ( a , b ) ≤ 3 (a,b)\ \ (1\leq a,b\leq n)\ s.t.\ \dfrac{\mathrm{lcm}(a,b)}{\gcd(a,b)}\leq 3 (a,b) (1≤a,b≤n) s.t. gcd(a,b)lcm(a,b)≤3.
有 t ( 1 ≤ t ≤ 1 e 4 ) t\ \ (1\leq t\leq 1\mathrm{e}4) t (1≤t≤1e4)组测试数据.每组测试数据输入一个整数 n ( 1 ≤ n ≤ 1 e 8 ) n\ \ (1\leq n\leq 1\mathrm{e}8) n (1≤n≤1e8).
满足要求的 ( a , b ) (a,b) (a,b)只有三种形式: ( x , x ) , ( x , 2 x ) , ( x , 3 x ) (x,x),(x,2x),(x,3x) (x,x),(x,2x),(x,3x).
[证] 设 d = gcd ( a , b ) d=\gcd(a,b) d=gcd(a,b).
注意到 a = k d ( k > 4 ) a=kd\ \ (k>4) a=kd (k>4)是不满足要求的,因为此时 l c m ( a , b ) ≥ k d > 3 d \mathrm{lcm}(a,b)\geq kd>3d lcm(a,b)≥kd>3d,
故可能满足要求的 ( a , b ) (a,b) (a,b)只有四种形式: ( d , d ) , ( d , 2 d ) , ( d , 3 d ) , ( 2 d , 3 d ) (d,d),(d,2d),(d,3d),(2d,3d) (d,d),(d,2d),(d,3d),(2d,3d),
而最后一种形式中 l c m ( a , b ) = 6 d \mathrm{lcm}(a,b)=6d lcm(a,b)=6d,不满足要求.
注意 a , b a,b a,b无序,故形如 ( x , 2 x ) (x,2x) (x,2x)和 ( x , 3 x ) (x,3x) (x,3x)的对数要乘 2 2 2, a n s = n + 2 ( ⌊ n 2 ⌋ + ⌊ n 3 ⌋ ) ans=n+2\left(\left\lfloor\dfrac{n}{2}\right\rfloor+\left\lfloor\dfrac{n}{3}\right\rfloor\right) ans=n+2(⌊2n⌋+⌊3n⌋).
void solve() {
int n; cin >> n;
cout << n + 2 * (n / 2 + n / 3) << endl;
}
int main() {
CaseT // 单测时注释掉该行
solve();
}
原题指路:https://codeforces.com/problemset/problem/1720/A
给定两个分数 a b \dfrac{a}{b} ba和 c d \dfrac{c}{d} dc.现有操作:选定一个整数 x x x,将一个分数的分子或分母乘 x x x(分母不能乘 0 0 0).问使得两分数相等所需的最小步数.
有 t ( 1 ≤ t ≤ 1 e 4 ) t\ \ (1\leq t\leq 1\mathrm{e}4) t (1≤t≤1e4)组测试数据.每组测试数据输入四个整数 a , b , c , d ( 0 ≤ a , c ≤ 1 e 9 , 1 ≤ b , d ≤ 1 e 9 ) a,b,c,d\ \ (0\leq a,c\leq 1\mathrm{e}9,1\leq b,d\leq 1\mathrm{e}9) a,b,c,d (0≤a,c≤1e9,1≤b,d≤1e9).
两次操作必可使得两分数相等,其中第一步将第一个分数乘 b c bc bc,得到 a b c b = a c \dfrac{abc}{b}=ac babc=ac,第二步将第二个分数乘 a d ad ad,得到 a c d d = a c \dfrac{acd}{d}=ac dacd=ac.
若初始时两分数已相等,则 a n s = 0 ans=0 ans=0.
下面讨论 a n s = 1 ans=1 ans=1的情况:
①操作为将第一个分数的分子乘 x x x,即 a x b = c d \dfrac{ax}{b}=\dfrac{c}{d} bax=dc,则 x = b c a d ∈ Z x=\dfrac{bc}{ad}\in\mathbb{Z} x=adbc∈Z,进而 a d ∣ b c ad\mid bc ad∣bc.
②操作为将第一个分数的分母乘 x x x,同理得 b c ∣ a d bc\mid ad bc∣ad.
void solve() {
ll a, b, c, d; cin >> a >> b >> c >> d;
ll x = a * d, y = b * c;
if (x == y) cout << 0 << endl;
else if (y && x % y == 0 || x && y % x == 0) cout << 1 << endl;
else cout << 2 << endl;
}
int main() {
CaseT // 单测时注释掉该行
solve();
}
截至2022.09.14,无新题目.