• [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\rfloor2pn<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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23


    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17


    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)=

    {xy,xyx," role="presentation">{xy,xyx,
    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 jpj  (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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18


    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9


    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13


    截至2022.09.14,无新题目.

  • 相关阅读:
    SSM《程序设计基础》课程答疑系统的设计与实现 毕业设计-附源码261620
    math_求和号的性质(变界)
    pytorch的安装【全官网流程】
    Python 提取加密的 PDF 中的文字
    pytorch collate_fn测试用例
    java基础之final关键字[21]
    VulnHub1:Jangow: 1.0.1靶机学习
    伯俊ERP与金蝶云星空对接集成表头表体组合查询连通分布式调出单新增(调拨出库对接分布式调出(KD调拨)6月)
    【JavaWeb的从0到1构建知识体系(七)】JUnit和JUL日志系统
    CDMP证书是什么样?CDMP证书有用吗?
  • 原文地址:https://blog.csdn.net/Hytidel/article/details/126864141