2021牛客暑期多校训练营#6:C-Delete Edges

2021牛客暑期多校训练营#6:C-Delete Edges

原题题解:https://ac.nowcoder.com/acm/contest/11257/C

题目大意

给定一个有 n ( 3 ≤ n ≤ 2000 ) n(3\leq n\leq 2000) n(3n2000)个点的完全图,j节点编号从 1 1 1 n n n,你可以多次删除图上的边,每次选择三个节点 x , y , z x,y,z x,y,z,其中 ( x , y ) (x,y) (x,y) ( x , z ) (x,z) (x,z) ( y , z ) (y,z) (y,z)并未被删除,然后删除这三条边。
求使得剩余边数小于 n n n的删边方案。

解题思路

做题胆要大,什么结论都往上套
首先,证明当 x + y + z ≡ 0 (   m o d     n ) x+y+z\equiv0(\bmod\ n) x+y+z0(mod n) x < y < z x <y<z x<y<z时删边不会重复。
x + y + z = n x+y+z=n x+y+z=n ( x + 1 ) + ( y + 1 ) + ( z + 1 ) = n + 3 (x+1)+(y+1)+(z+1)=n+3 (x+1)+(y+1)+(z+1)=n+3

x111 … \ldots 1
y234 … \ldots 偶: n 2 \frac{n}{2} 2n·奇: ⌊ n + 2 2 ⌋ \lfloor\frac{n+2}{2}\rfloor 2n+2
znn-1n-2 … \ldots 偶: n + 4 2 \frac{n+4}{2} 2n+4·奇: ⌊ n + 2 2 ⌋ \lfloor\frac{n+2}{2}\rfloor 2n+2

一共有 ⌊ n − 1 2 ⌋ \lfloor\frac{n-1}{2}\rfloor 2n1个。
x + y + z = 2 n x+y+z=2n x+y+z=2n ( x + 1 ) + ( y + 1 ) + ( z + 1 ) = 2 ( n + 3 ) (x+1)+(y+1)+(z+1)=2(n+3) (x+1)+(y+1)+(z+1)=2(n+3),而当 z = n + 2 z=n+2 z=n+2时,

zn+3n+3n+3 … \ldots
x123 … \ldots
ynn-1n-2 … \ldots

共有 ⌊ n 2 ⌋ + 1 \lfloor \frac{n}{2}\rfloor+1 2n+1个。
得出递推式
f ( n + 3 ) = f ( n ) + ⌊ n − 1 2 ⌋ + ⌊ n 2 ⌋ + 1 = f ( n ) + { n − 1 2 + n − 1 2 + 1 ( n % 2 = = 1 ) n 2 + n − 2 2 + 1 ( n % 2 = = 0 ) = f ( n ) + n \begin{aligned} f(n+3)&=f(n)+\lfloor\frac{n-1}{2}\rfloor+\lfloor \frac{n}{2}\rfloor+1\\ &=f(n)+ \left\{ \begin{array}{rcl} &\frac{n-1}{2}+\frac{n-1}{2}+1&(n\%2==1)\\ &\frac{n}{2}+\frac{n-2}{2}+1&(n\%2 ==0) \end{array} \right.\\ &=f(n)+n \end{aligned} f(n+3)=f(n)+2n1+2n+1=f(n)+{2n1+2n1+12n+2n2+1(n%2==1)(n%2==0)=f(n)+n
之后枚举 x , y x,y x,y,算出 z z z,可AC。

拓展时间

本题范围不大,但如果达到 1 0 9 10^9 109,暴力就肯定超时,以下是两种解法。

矩阵快速幂

我们老师说:大部分线性变换都可以用矩阵快速幂来做
首先写出矩阵 [ f ( n ) f ( n − 1 ) f ( n − 2 ) n − 2 1 ] \begin{bmatrix} f(n) \\ f(n-1) \\ f(n-2)\\ n-2 \\ 1 \end{bmatrix} f(n)f(n1)f(n2)n21
写出等式
[ f ( n + 1 ) f ( n ) f ( n − 1 ) n − 1 1 ] = [ 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 ] [ f ( n ) f ( n − 1 ) f ( n − 2 ) n − 2 1 ] \begin{bmatrix} f(n+1) \\ f(n) \\ f(n-1)\\ n-1\\ 1 \end{bmatrix}= \begin{bmatrix} &0&0&1&1&0&\\ &1&0&0&0&0\\ &0&1&0&0&0\\ &0&0&0&1&1\\ &0&0&0&0&1 \end{bmatrix} \begin{bmatrix} f(n) \\ f(n-1) \\ f(n-2)\\ n-2 \\ 1 \end{bmatrix} f(n+1)f(n)f(n1)n11=0100000100100001001000011f(n)f(n1)f(n2)n21
最后矩阵快速幂求得方案数。

数学

我们由上得知 n ( n − 1 ) 2 − 2 f ( n ) < n 3 f ( n ) > n ( n − 1 ) 2 − n f ( n ) > n ( n − 3 ) 6 \begin{aligned} \frac{n(n-1)}{2}-2f(n)&<n\\ 3f(n)&>\frac{n(n-1)}{2}-n\\ f(n)&>\frac{n(n-3)}{6} \end{aligned} 2n(n1)2f(n)3f(n)f(n)<n>2n(n1)n>6n(n3)
n   m o d   3 = 0 n\bmod3=0 nmod3=0
f ( 3 ) + 3 = f ( 6 ) , f ( 6 ) + 6 = f ( 9 ) , f ( 9 ) + 9 = f ( 12 ) … f(3)+3=f(6),f(6)+6=f(9),f(9)+9=f(12)\ldots f(3)+3=f(6),f(6)+6=f(9),f(9)+9=f(12)
可知为等差数列。
可得当 n   m o d   3 = 0 n\bmod3=0 nmod3=0
f ( n ) = ( n 2 − 3 n + 3 ) ( n − 1 ) 6 + 1 f(n)=\frac{(n^2-3n+3)(n-1)}{6}+1 f(n)=6(n23n+3)(n1)+1
其它情况亦可推出。
写出通项式:
f ( n ) = { n 2 − 3 n + 3 6 > n ( n − 3 ) 6 ( n % 3 = = 0 ) n 2 − 3 n + 3 6 > n ( n − 3 ) 6 ( n % 3 ! = 0 ) f(n)= \left\{ \begin{array}{rcl} \frac{n^2-3n+3}{6}&>\frac{n(n-3)}{6}&(n\%3==0)\\ \frac{n^2-3n+3}{6}&>\frac{n(n-3)}{6}&(n\%3 !=0) \end{array} \right. f(n)={6n23n+36n23n+3>6n(n3)>6n(n3)(n%3==0)(n%3!=0)

代码实现

#include<bits/stdc++.h>
using namespace std;
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); 
	int n,ans=0;
	cin>>n;
	if(n%3==0)ans=n*n-3*n+6;
	else
	ans=n*n-3*n+2;
    ans/=6;
	cout<<ans<<'\n';
        for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            int k=(2*n-i-j)%n;
            if(j<k)cout<<i+1<<' '<<j+1<<' '<<k+1<<'\n';
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值