P7108 移花接木(分类讨论思维)
P7108 移花接木(分类讨论&思维)
题意
给定一棵无限高度的满 a a a叉树。
给定两个操作。
1.删除一个结点及其子树。
2.将一个结点及其子树移到另一个结点。
求将满 a a a叉树变成高度为 h h h的满 b b b叉树的最小操作数。
思路
分类讨论。
1.当 a > b a>b a>b时,显然我们只需用操作1。
对于第一层需要删 a − b a-b a−b次,第二层需要删 ( a − b ) b (a-b)b (a−b)b次,依次类推,到第 1 1 1到第 h h h层共需删 ∑ i = 1 h ( a − b ) b i − 1 \sum\limits_{i=1}^h(a-b)b^{i-1} i=1∑h(a−b)bi−1
然后对于第 h + 1 h+1 h+1层的结点我们都需要删掉,操作 a b h ab^h abh次。
所以 a n s = a b h + ∑ i = 1 h ( a − b ) b i − 1 ans=ab^h+\sum\limits_{i=1}^h(a-b)b^{i-1} ans=abh+i=1∑h(a−b)bi−1,后面是等比数列求和。
a n s = a b h + ( a − b ) ( b h − 1 ) h − 1 ans=ab^h+\dfrac{(a-b)(b^h-1)}{h-1} ans=abh+h−1(a−b)(bh−1)
2.当 a ≤ b a\le b a≤b时。
考虑先补全第 1 1 1到第 h h h层,然后删掉第 h + 1 h+1 h+1层。
类似地,第一层需要补 ( b − a ) (b-a) (b−a)次,第二层需要补 ( b − a ) b (b-a)b (b−a)b。
共需要补 ( b − a ) ∑ i = 1 h b i − 1 (b-a)\sum\limits_{i=1}^hb^{i-1} (b−a)i=1∑hbi−1次。
同时要删掉第 h + 1 h+1 h+1层的,要操作 a b h ab^h abh次。
注意到,补全的操作可以从第 h + 1 h+1 h+1层来移动,所以我们只需取 m a x { a b h , ( b − a ) ∑ i = 1 h b i − 1 } = a b h max\{ab^h,(b-a)\sum\limits_{i=1}^hb^{i-1}\}=ab^h max{abh,(b−a)i=1∑hbi−1}=abh。
同时需要特判 b = 1 b=1 b=1 的情况,因为上面的两种情况的式子 b ≠ 1 b\ne1 b=1。
即第 1 1 1层到第 h h h层共需删 h ( a − 1 ) h(a-1) h(a−1)次。
第 h + 1 h+1 h+1层需要删 a a a次。
a n s = ( a − 1 ) h + a ans=(a-1)h+a ans=(a−1)h+a。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
ll ksm(ll a,ll n){ll s=1;while(n){if(n&1) s=s*a%mod;a=a*a%mod;n>>=1;}return s;
}
ll a,b,h;
int main(){int t;scanf("%d",&t);while(t--){scanf("%lld%lld%lld",&a,&b,&h);if(b==1) printf("%lld\n",((a-1)*h%mod+a)%mod);else if(a<=b) printf("%lld\n",a*ksm(b,h)%mod);else printf("%lld\n",(a*ksm(b,h)%mod+(a-b)*(ksm(b,h)-1)%mod*ksm(b-1,mod-2)%mod)%mod);}return 0;
}
P7108 移花接木(分类讨论思维)相关推荐
- CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...
- 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)
题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...
- Unfair contest 模拟-分类讨论
题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...
- 2020ICPC(上海) - Walker(分类讨论+二分)
题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...
- 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)
[UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...
- uoj#246. 【UER #7】套路(dp+分块?分类讨论?)
题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...
- Vasya and Multisets CodeForces - 1051C 模拟|分类讨论
题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为 ...
- P3842 [TJOI2007]线段(线性dp,分类讨论)
P3842 [TJOI2007]线段 题意 [TJOI2007]线段 题目描述 在一个 n×nn \times nn×n 的平面上,在每一行中有一条线段,第 iii 行的线段的左端点是(i,Li)(i ...
- HDU 6627 equation(模拟,分类讨论)
题意:给你n个ai和bi,给你C,求解方程: 分析:初中数学,分类讨论破除绝对值符号.每两个零点之间的区域都对应一个一元一次方程,把这些零点排序之后可以很容易得到每个区间的方程,每个区间都解一个一元一 ...
最新文章
- cisco PIX防火墙的配置及注解完全手册
- 宝塔显示linux inode,Linux显示inode的信息
- Linux 性能測试工具
- 机房合作--gitee的使用
- extmail垃圾邮件存放垃圾邮件箱
- java+long是什么_Java中long的模运算符是什么? - java
- 天然气压缩因子计算软件_徐秀芬等:天然气加气站压缩机组效率的计算方法
- day9 java的静态代码块和代码执行顺序
- 将先前的提交分成多个提交
- pyspark对Mysql数据库进行读写
- Python利用shelve模块设计简单数据库程序
- Atitit 知识图谱解决方案:提供完整知识体系架构的搜索与知识结果overview
- vscode字体图标
- 怎样编辑pdf文件?手把手教你如何使用PDF编辑器
- Elasticsearch创建索引别名
- NetFPGA-SUME10G以太网接口仿真问题
- (二)PUN 2基本教程
- Java项目:jsp+servlet图书管理系统
- linux模拟usb发包,Linux下USB模拟ps2鼠标驱动
- 如何使用Jmeter对HTTP接口进行压力测试?
热门文章
- vscode配置python路径_Vscode的python配置(macOS)
- css3 3d x y z 轴,3D变形 CSS3 transform---rotateX(), rotateY(), rotateZ(), 透-站长资讯中心
- 计算机的c盘为什么总是分100g能更大吗,C盘空间越来越小,罪魁祸首原来是“它”,难怪100G也不够用!...
- python grad_在Python中实现Adagrad
- 小米海康威视 暑期实习前端面试
- 2023春 哈尔滨工业大学计算机系统大作业
- 修改redis配置文件redis.conf文件内容后,重启redis,所配置的属性没有生效
- Linux基础指令(含英文注释)
- 网络抓包神器-Charles使用指南
- “代理服务器拒绝连接“问题