构造专项(ideas)
数学构造
P5441 【XR-2】伤痕
有点神秘。反正我不会,有人所是
首先,一个很显然的事实是找出来的这四个点要强联通。所以总方案数减去不强连通的方案数。
通过一些手段,我们可以发现不连通的方案只有三种情况(只考虑图中某四个点)。
- 一个点是三个单向边的起点(有进不去的点)
- 不属于第一种的情况同时有一个点是三个单向边的终点(不然会重,有出不去的点)
- 分两组组内之间连无向边,一个组向另一个边连单向边(有一组出不去)
我也不太懂怎么证明所有不强联通的一定被包含,所以可以自己打表证明。
然后考虑如何最小化,首先第一类边我们设第
然后考虑第二和第三种情况,发现可以构造规避,将
首先证明第二种情况不存在。
如果有四个点
接下来证明第三种情况不存在。
我们令a=1,b=(n+1)/2 它们之间无向边,则要找到两个点
所以不存在第三种情况。(证明借鉴了洛谷题解)
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
using namespace std;
const int N=105;
int n,mp[N][N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
if(n==1)
{
cout<<"0"<<'\n'<<'0';//特殊处理选不出方案的情况
return 0;
}
cout<<(1ll*n*(n-3)*(n*n+6*n-31)/48)<<'\n';
//最大方案数
for(int i=1;i<=n;i++)
for(int j=1;j<=(n+1)/2;j++)
mp[i][(i+j-1)%n+1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<mp[i][j]<<' ';
cout<<'\n';
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具