计蒜客-2017 ACM-ICPC 亚洲区(西安赛区)网络赛E题Maximum Flow(网络流打表找规律)

最大流 (Maximum Flow) 之 流网络和流 最大流(Maximum Flow) 流网络和流(Flow networks and flows) 流网络(Flow networks) G=(V,E)G=(V,E)G=(V,E) 是一个有向图, 图中每条边 (u,v)∈E(u,v) \in E(u,v)∈E 有一个非负的 容量值(Capacity) c(u,v)≥0c(u,v) \geq 0c(u,v)≥0. 如果边集合 EEE 包含一条边 (u,v)(u,v)(u,v), 则图中不存在反方向的边 (v,u)(v,u)(v,u). 如果 (u,v)∉ 阅读详情

题意:

给定一个n(2<=n<=1e18),编号从0->n-1,若满足0<=i<j<=n-1,则有i->j的一条边,边权为i^j,求该网络图的最大流。

思路:

打表前几十项后然后对相邻两项作差发现(从第二组开始,则开始ans为1),每两项之间的差值都是4^k(k>=0)然后再+1,然后发现可以将所有差值-1按1,2,4,8...个为一组分成多组(组的编号从0开始):

1

1 4

1 4 1 16

1 4 1 16 1 4 1 64

......

每组的相加和等于上一组的相加和*2,然后再减去上一组的最后一个元素值,加上当前组的最后一个元素值。而对于每一组的最后一个元素值,恰好就是4^(当前组的编号),然后基此可以求出所有组的和。然后再分析和n的关系,首先找出最后一个第k组满足前k组的所有元素的个数<=n,然后ans += 前k组的所有元素的和, n -= 前k组的所有元素的个数。然后会发现如果有剩余,那么剩余的是由前面的k个组的元素组合而成的,然后再从k开始向前找其组合,ans相应的加,n相应的减,必定能将n减至0,也就求出了ans。

正解不是这么做,得学...

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9+7;
ll sum[70], e[70], num[70];
ll qpow(int b)
{
	ll ans = 1, bas = 4;
	while(b)
	{
		if(b&1) ans = ans*bas%mod;
		bas = bas*bas%mod;
		b >>= 1;
	}
	return ans;
}
void init()
{
	e[0] = 1, e[1] = 5;
	sum[0] = 2, sum[1] = 9;
	num[0] = 1, num[1] = 3;
	for(int i = 2; i < 63; ++i)
	{
		e[i] = (e[i-1]*2%mod+(qpow(i)-qpow(i-1)+mod)%mod)%mod;
		num[i] = (num[i-1]+(1ll<<i));
		sum[i] = (sum[i-1]+e[i]+(1ll<<i))%mod;
	}
}
ll n, ans;
int main()
{
	init();
	while(~scanf("%lld", &n))
	{
		ans = 1; n -= 2;
		for(int i = 62; i >= 0; --i)
		{
			if(n >= num[i])
			{
				ans = (ans+sum[i])%mod;
				n -= num[i];
				break;
			}
		}
		for(int i = 62; i >= 0; --i)
		{
			if(n >= (1ll<<i))
			{
				ans = (ans+e[i]+(1ll<<i)%mod)%mod;
				n -= (1ll<<i);
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
}


打表代码:

#include <algorithm>  
#include <iostream>  
#include <string.h>  
#include <cstdio>  
#include <queue>  
using namespace std;  
const int inf = 0x3f3f3f3f;  
const int maxn = 205;  
const int maxm = maxn*maxn;  
struct node{int v, w, next;} edge[maxm];  
int dis[maxn], pre[maxn], rec[maxn], head[maxn], block[maxn];  
int n, m, no = 0;  
queue<int> q;  
inline void init()  
{  
    no = 0;  
    memset(head, -1, sizeof head);  
}  
inline void add(int u, int v, int w)  
{  
    edge[no].v = v; edge[no].w = w;  
    edge[no].next = head[u]; head[u] = no++;  
    edge[no].v = u; edge[no].w = 0;  
    edge[no].next = head[v]; head[v] = no++;  
}  
void reset(int S, int T)  
{  
    memset(dis, 0x3f, sizeof dis);  
    memset(block, 0, sizeof block);  
    q.push(S); dis[S] = 0;  
    while(!q.empty())  
    {  
        int top = q.front(); q.pop();  
        for(int k = head[top]; k != -1; k = edge[k].next)  
        if(dis[edge[k].v] == inf && edge[k].w)  
            dis[edge[k].v] = dis[top]+1, q.push(edge[k].v);  
    }  
}  
int dinic(int S, int T)  
{  
    int ans = 0, flow = inf, top = S;  
    reset(S, T); pre[S] = S;  
    while(dis[T] != inf)  
    {  
        int k, tmp;  
        for(k = head[top]; k != -1; k = edge[k].next)  
        {  
            if(edge[k].w && dis[edge[k].v]==dis[top]+1 &&   
            !block[edge[k].v]) break;  
        }  
        if(k != -1)  
        {  
            tmp = edge[k].v;  
            flow = min(flow, edge[k].w);  
            pre[tmp] = top, rec[tmp] = k;  
            top = tmp;  
            if(top == T)  
            {  
                ans += flow; tmp = -1;  
                for(; top != S; top = pre[top])  
                {  
                    edge[rec[top]].w -= flow;  
                    edge[rec[top]^1].w += flow;  
                    if(!edge[rec[top]].w) tmp = top;  
                }  
                flow = inf;  
                if(tmp != -1)  
                {  
                    top = pre[tmp];  
                    for(; top != S; top = pre[top])  
                    flow = min(flow, edge[rec[top]].w);  
                    top = pre[tmp];  
                }  
            }  
        }  
        else  
        {  
            block[top] = 1;  
            top = pre[top];  
            if(block[S]) reset(S, T);  
        }  
    }  
    return ans;  
}  
void mapping()  
{
    for(int i = 0; i < n; ++i)
	for(int j = i+1; j < n; ++j)  
    add(i, j, (i^j));
}  
int main()  
{  
	int up = 100, pre = 0;
    for(n = 2; n <= up; ++n)
    {  
        init(); mapping();
        int t = dinic(0, n-1);
        printf("id: %d\t value: %d\t differen: %d\t add-1: %d\n", n, t, t-pre, t-pre-1);  
        pre = t;
    }  
    return 0;  
}



继续加油~

Algorithm: Maximum Flow Problem reference 【Introduction to Algorithm Chapter 26】 Problem Setting We wish to compute the greatest rate at which we can ship material from the source to the sink without violating any capacity constra... 阅读详情

相关推荐

Nginx国密HTTPS实战:SM2双证书部署与TongSuo编译指南

HTTPS作为保障网络通信安全的基石,其核心在于SSL/TLS协议与公钥基础设施(PKI)。它通过非对称加密实现身份认证与密钥交换,再结合对称加密确保数据传输的机密性与完整性。在金融、政务等对自主可控有严格要求的领域,采用符合国家密码管理局标准的国密算法(SM2/SM3/SM4)替代国际通用算法(如RSA/SHA-256/AES),已成为满足安全合规要求的关键技术路径。国密SSL不仅是一套算法替换,更涉及从底层密码库到上层应用服务的完整技术栈改造。其核心价值在于实现密码技术的自主可控,提升特定场景下的安全防

weixin_29323365的博客 495

2017 ACM-ICPC 亚洲区乌鲁木齐赛网络赛 E

数论题(划掉)打表题 打出所有的表来就可以了 #include #include #include #include #include using namespace std; long long s[100]= {1,8,49,288,1681,9800,57121,332928,1940449,11309768,65918161,384199200,2239277041

Little_boy_z的博客 337

保姆级避坑指南:在Ubuntu 22.04上用ROS2 Humble搞定TurtleBot3的SLAM与导航(附5个常见报错解决方案)

本文提供了一份详细的Ubuntu 22.04上使用ROS2 Humble和TurtleBot3进行SLAM建图与导航的避坑指南,涵盖Gazebo启动失败、场景加载问题、环境变量设置、GLIBCXX版本冲突及Nav2参数配置等5个常见报错的解决方案,帮助开发者高效完成机器人导航项目。

weixin_29062823的博客 285

计蒜客-2017 ACM-ICPC 亚洲区(西安赛区)网络赛E题Coin(概率、组合数学)

计蒜客-2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Bob has a not even coin, every time he tosses the coin, the probability that the coin's front face up is \frac{q}{p}(\frac{q}{p} \le \frac{1}{2}) ​p​q​​ (​p​​q​​ ≤​2​​1​​ ). The question is, when Bob tosses the coin kk times,

yo_bc的博客 526

三相直流无刷电机(带HALL传感器)BLDC控制一

本案例选择TIM0的CH0/CH1/CH2三个通道接入三路原始hall输出信号。三路TIM_CHx(48)通过配置存入到NIP寄存器(new input pattern,3 bits)内。未完待续。

m0_69929716的博客 405

YOLOv8【第九章:模型部署篇·第2节】一文搞懂,模型剪枝与压缩技术!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1523

2017 ACM-ICPC 亚洲区(西安赛区)网络赛b题Coin(矩阵快速幂)

2017 ACM-ICPC 亚洲区(西安赛区)网络赛b Coin

csl784513390的博客 660

完整复盘【避雷jd文职某岗位】潍坊青州hhj(据说未来搬到天津),助理实验师岗位,三人进面,面试全部不及格,空头岗位!像这种情况,该单位很多 | 附个人完整备考背诵题目 | 世间一场梦,不会再考这个了

本文以博主本人报考jun dui文职,从报考、备考、考试、查成绩到资格审查、面试,全程亲身经历,给想要报考该内容的朋友们一些小的参考。祝你顺利上岸!完整复盘【避雷jd文职某岗位】潍坊青州hhj(据说未来搬到天津),助理实验师岗位,三人进面,面试全部不及格,空头岗位!像这种情况,该单位很多 | 附个人完整备考背诵题目 | 世间一场梦,不会再考这个了

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 245

2017 ACM-ICPC 亚洲区域赛【西安站网赛】Maximum Flow

一道很神奇的题 送上计蒜客传送门:https://nanti.jisuanke.com/t/17118 题目大意: 有101810^{18}个点的图,他们两两之间有一条边,边的流量是i ^ j。 现在问。从0点出发到n - 1点,最大流是多少。 吐槽: 比赛的时候,找网络流队友暴力打了前1000个数出来,竟然发现了规律。。然后硬生生怼了个log(n)的

QuanQqqqq的博客 996

一文看懂EMMC原理及工作过程

CMD:用于设备初始化和命令传输的双向通道, CMD信号有2种工作模式:1#:漏极开路--->用于初始化模式2#:推拉--->用于快速命令传输其中命令从eMMC主机控制器发送到eMMC设备,响应从设备发送到主机。DAT [7:0]:双向数据信号,模式包括:1(DAT0);默认情况下,通电或重置后,只有DAT0用于数据传输。DAT信号在推挽模式下工作,eMMC设备包括数据线DAT1-DAT7的内部上拉。进入4位模式后,设备立即断开线路DAT1、DAT2和DAT3的内部上拉;

Airer_00的博客 2029

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

2017 ACM西安网络赛 G题 Xor

题意: 给出一棵树,每个节点有个val,q个询问。 询问格式:u, v, k, 从u到v的路径, 每个k个点取一个,求所有点的val值异或和。 如果没有隔k个取1个的限制的话,那么做法是很显然的,dfs一遍,求出所有点到根的异或和,ans=xor(u, root)^xor(v, root)^(lca(u, v),root)。 现在有步长的限制,取m=sqrt(n), 1)预处理出步长k<=

Infinity的博客 766

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Maximum Flow - 2017 ACM-ICPC 亚洲区(西安赛区)网络赛

Given a directed graph with nn nodes, labeled 0,1, \cdots, n-10,1,⋯,n−1. For each <i, j>i,j> satisfies 0 \le i 0≤ijn, there exists an edge from the i-th node to the j-th node, the capacity

J. Cole 448

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E. Maximum Flow

Given a directed graph with nnn nodes, labeled 0,1,⋯,n−10,1, \cdots, n-10,1,⋯,n−1. For each i,j> satisfies 0≤i0≤ijn, there exists an edge from the i-th node to the j-th node, the capacity of wh

WZJRJ28 451

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E.Maximum Flow【规律】

Given a directed graph with nn nodes, labeled 0,1, \cdots, n-10,1,⋯,n−1. For each <i, j>i,j> satisfies 0 \le i 0≤ijn, there exists an edge from the i-th node to the j-th node, the capacity

mengxiang000000 624

Maximum Flow 规律题 2017 ACM-ICPC 亚洲区(西安赛区)网络赛

Given a directed graph with nn nodes, labeled 0,1, \cdots, n-10,1,⋯,n−1. For each <i, j>i,j> satisfies 0 \le i 0≤ijn, there exists an edge from the i-th node to the j-th node, the capacity

你那么爱笑,家里人知道吗? 437

2017 ACM-ICPC 亚洲区(西安赛区)网络赛 c题 sum

## 标题 ##2017 ACM-ICPC 亚洲区(西安赛区)网络赛 c 题 sum

wuxiaowu547的博客 528

2017ACM-ICPC亚洲区域赛西安站热身赛 B. A+B or A-B(模拟)

题意 给你字符画版的a+b和a-b,然后继续以字符画的形式输出计算结果 思路这个在打热身赛的时候这道题是我做的,思路也是对的,不过没有看数据范围,我以为a,b两个数都是0~9,结果交上去发现WA了,然后才发现这个事情,匆匆忙忙改bug没改出来。。。我的锅。。我背,虽然题目没有放出来,我在这里把题目补一下自己出的样例输入....x.....x.......xxxxx.xxxxx.xxxxx.xxx

riba2534的博客 1381

Maximum Flow(2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E)

Problem Description Given a directed graph withnnnodes, labeled 0,1,⋯,n−1. For each<i, j>satisfies 0≤i<j<n, there exists an edge from the i-th node to the j-th node, the capacity of...

Alex_McAvoy的博客 325

ACM随笔------计蒜客 求平方根

设计函数int sqrt(int x),计算x的平方根。 格式:    输入一个数x,输出它的平方根。直到碰到结束符号为止。    千万注意:是int类型哦~    输入可以如下操作: while(cin>>x) 或者 while(scanf("%d", &x) != EOF) 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 1 1

yd2011222的博客 545

网络流 (费用流+拆边)——Transportation ( HDU 3667 )

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3667 分析: 给出N个城市,M条路,K个货物,每条路的费用系数aia_i和最大运送数量C,求把K个货物从城市1运送到N需要的最小费用,每条路的费用为一个系数aia_i乘以在这条路上运送的货物数量的平方。一看便是一个最大流最小费用,不过费用为动态的,所以我们可以采用拆边的方法,把动态的费用变成静态的

FeBr2的博客 706

Codeforces Round #511 (Div. 1) B Little C Loves 3 II(利用网络流打表找规律)

题目链接:http://codeforces.com/contest/1034 题目大意:一个n*m的图,每次可以放入两个曼哈顿距离为3的点,问最多能放多少点 题目思路:咋这题给过成签到了啊,各位神仙找规律都这么猛的吗? 后来结束后有菊苣说可以用网络流打表,试了一下发现居然真的可以 每个点本身就是(i-1)*m+j,对于可以到的点,假设能连到xx yy,那就连n*m+(xx-1...

smilestruggler_Fly To Higher 260

计蒜客-2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-A-Banana

ACM模版题解我不喜欢计蒜客,我都等了两天了,还没有地方可以提交……现在连题目都看不了,算了,题解就不写了,光发一下代码吧……代码#include <iostream> #include <vector> #include <algorithm>using namespace std;const int MAXN = 50;int n, m; vector<int> mon[MAXN + 3]; v

逐梦者 440

网络流-割的概念以及定理

1. 网络流的割:是网络中顶点的一个划分,把所有顶点划分成两个顶点集合S和T,其中源点s属于S,汇点t属于T,记作CUT(S,T)。 2. 割的割边:如果一条弧的两个顶点一个属于顶点集S一个属于顶点集T,该弧为割CUT(S,T)的一条割边。 3. 从S指向T的割边是正向割边;    从T指向S的割边是逆向割边。 4. 割的容量:所有正向割边的容量和,不同割的容量不同。 5.

yo_bc的博客 6909
上一篇: HDU-6214 Smallest Minimum Cut(最小割)
下一篇: HDU-5437 Alisha’s Party(STL+模拟)
薄层
博客等级 码龄10年 242粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值