[Codeforces] number theory (R1200) Part.10

[Codeforces] number theory (R1200) Part.10

题单:https://codeforces.com/problemset/page/6?tags=number%20theory,0-1200

1658B. Marin and Anti-coprime Permutation

原题指路: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(1p1,2p2,,npn)>1.求 1 ∼ n 1\sim n 1n的排列中好的排列的个数,答案对 998244353 998244353 998244353取模.

t    ( 1 ≤ t ≤ 1000 ) t\ \ (1\leq t\leq 1000) t  (1t1000)组测试数据.每组测试数据输入一个 n    ( 1 ≤ n ≤ 1000 ) n\ \ (1\leq n\leq 1000) n  (1n1000).

思路

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(1p1,2p2,,npn),则 g ≤ 2 g\leq 2 g2.

[] ① g > 2 g>2 g>2时,若 ∃ \exists 素数 p > 2   s . t .   p ∣ g p>2\ s.t.\ p\mid g p>2 s.t. pg,因 1 ∼ n 1\sim n 1n中有 ⌊ 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<n 2pn<n个数.

g ≤ 2 g\leq 2 g2时,可将值为奇数的数放在偶数下标的位置,将值为偶数的数放在奇数下标的位置. 1 ∼ n 1\sim n 1n中有 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();
}


1679A. AvtoBus

原题指路: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  (1t1000)组测试数据.每组测试数据第一行输入一个整数 n    ( 1 ≤ n ≤ 1 e 18 ) n\ \ (1\leq n\leq 1\mathrm{e}18) n  (1n1e18).

思路

设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) 2n0  (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) 2n1  (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) 2n2  (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) 2n0  (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) 2n1  (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();
}


1712B. Woeful Permutation

原题指路:https://codeforces.com/problemset/problem/1712/B

题意

构造一个 1 ∼ n 1\sim n 1n的排列 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  (1t1000)组测试数据.每组测试数据输入一个整数 n    ( 1 ≤ n ≤ 1 e 5 ) n\ \ (1\leq n\leq 1\mathrm{e}5) n  (1n1e5).数据保证所有测试数据的 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,n1;②若 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,n1.

[] 定义函数 f ( x , y ) = { x y , x ≠ y x , 其余情况 f(x,y)=\begin{cases}xy,x\neq y \\ x,其余情况\end{cases} f(x,y)={xy,x=yx,其余情况.

显然 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 1p1++npn的最大值,其中 p i ≠ i    ( 1 ≤ i ≤ n ) p_i\neq i\ \ (1\leq i\leq n) pi=i  (1in).

​ 该问题等价于求 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 j<i) pj  (1j<i).

以排列中的 n n n个元素为节点、以 i → p i i\rightarrow p_i ipi为边.除 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} =2x12x1x2+2x22+2x22x2x3+2x32++2xk2xkx1+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(x1x2)2+(x2x3)2++(xkx1)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\} 2x1x2+x2x3++xkx1max{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),,(n1,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} 2n1<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();
}


1717A. Madoka and Strange Thoughts

原题指路: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)  (1a,bn) 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  (1t1e4)组测试数据.每组测试数据输入一个整数 n    ( 1 ≤ n ≤ 1 e 8 ) n\ \ (1\leq n\leq 1\mathrm{e}8) n  (1n1e8).

思路

满足要求的 ( 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();
}


1720A. Burenka Plays with Fractions

原题指路: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  (1t1e4)组测试数据.每组测试数据输入四个整数 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  (0a,c1e9,1b,d1e9).

思路

两次操作必可使得两分数相等,其中第一步将第一个分数乘 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=adbcZ,进而 a d ∣ b c ad\mid bc adbc.

②操作为将第一个分数的分母乘 x x x,同理得 b c ∣ a d bc\mid ad bcad.

代码

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,无新题目.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值