SRM707 div1 MultiplyAddPuzzle
题目大意:给定4个数,s,t,a,b
每次可以将s加a或者乘b,问最少多少次可以得到t
做法:考虑最后的形式,肯定是s*b^n + a*f(b),f(b)是关于b的多项式
那么b乘多少次实际上是可以知道的,然后枚举b的次数n
知道了t - s*b^n,接下来就是求f(b)了
可以知道,按照b进制做是最优的。
这里不能只算最大的n,我是把n从0到最大都算了一遍
因为有些情况较小的n得出的答案会更优。
还有这题的特殊情况相当多orz
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <typeinfo>
#include <fstream>
using namespace std;
typedef long long LL;
int f[];
class MultiplyAddPuzzle {
public:
long long minimalSteps(long long s, long long t, long long a, long long b) {
if(s > t && b != ) return -;
if(s == t) return ;
if(b == ){
if(a == ) return -;
if( (t-s)%a != ) return -;
return (t-s)/a;
}
if(b == ){
if(t == ) return ;
if(a == ) return -;
if(t > s && (t-s)%a == ) return (t-s)/a;
if( t%a == ) return t/a+;
return -;
}
if(a == ){
if(s == ) return -;
if(t%s != ) return -;
LL temp = t/s, ans = ;
while(temp != ){
if(temp % b != ) return -;
ans++; temp /= b;
}
return ans;
}
LL bt = , bpow = , temp = ;
while(s <= t/bpow){
if( (t-s*bpow)%a == ) f[bt] = , temp = bt;
bt++;
if(bpow > 2e18/b) break;
bpow *= b;
}
bt = temp;
if(bt == ) { if( (t-s)%a != ) return -; else return (t-s)/a; }
temp = ;
LL ANS = f[] == ? (t-s)/a : 2e18;
for(int i = ; i <= bt; i++) {
temp *= b;
if(!f[i]) continue;
bpow = temp;
LL ans = i, res = (t-s*bpow)/a;
while(res > ){
ans += res/bpow;
res %= bpow;
bpow /= b;
}
ANS = min(ANS, ans);
}
return ANS;
}
};
SRM707 div1 MultiplyAddPuzzle的更多相关文章
- CF#345 (Div1)
论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...
- 图论 SRM 674 Div1 VampireTree 250
Problem Statement You are a genealogist specializing in family trees of vampires. Vampire famil ...
- jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 第一次div1做出3道题
第一次div1做出3道题! 再接再厉! 哈利路亚!
- 第一次进div1了
第一次进div1~好激动啊! 上帝依旧那么眷顾我!
- TopCoder 649 div1 & div2
最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...
- SRM DIV1 500pt DP
SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...
- codeforces #305 div1 done
总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
随机推荐
- Struts2拦截器说明
有关于Struts2的拦截器的原理 在此共设置了两个拦截器,firstInterception.SecondInterception package struts2_inteception; publ ...
- 针对 npm ERR! cb() never called! 问题
在开发项目安装依赖时(npm install) 往往会报 npm ERR! cb()never called!的错误 如图: 解决方法: 一.首先要以管理员模式打开cmd清除你的npm缓存 : np ...
- what is feeding and what is 读扩散 and 写扩散?
what is feeding? 通俗点说feed系统就是当你登陆进对应网站后:微信朋友圈的动态.人人网上看到的一件件新鲜事.新浪微博上推到你面前的一条条新围脖等等.系统中的每一条消息就是一个feed ...
- web学习第一天
学习web心得 表格 table,表单 form,跑马灯效果 marquee,导入背景图片<img src="图片路径"> 第一天学的不是很难,作业也相对来说比较简单, ...
- docker理论基础
Namespaces 命名空间(namespaces)是 Linux 为我们提供的用于分离进程树.网络接口.挂载点以及进程间通信等资源的方法.在日常使用 Linux 或者 macOS 时,我们并没有运 ...
- C# 测量程序运行时间
using System.Diagnostics; Stopwatch watch = new Stopwatch(); watch.Start(); /* 需要测量运行时间的程序 */ watch. ...
- MAVEN的项目升级
今天我们来介绍一下版本依赖的问题 1.如果是admin的话,他要依赖于service的版本,则service的版本依赖于core的版本, 如果是本地编译,这我直接更新admin的就可以了,然后直接跑就 ...
- 使用 MySQL 存储 Hue 元数据
1.在 MySQL 中增加数据库 hue 2.编辑 hue.ini 文件 [[database]] # Database engine is typically one of: # postgresq ...
- 2016年JD工作遇到的问题:1-5,搭建环境和熟悉项目过程中的坑
1.更新不需要权限的项目A,却提示没有权限. 先从Git上更新项目A的代码,提示没有权限. 然后从Git上更新其它项目B的代码,正常. 再更新项目A的代码,正常了. 奇葩问题! 2.Eclipse中, ...
- ORB-SLAM 代码笔记(四)tracking代码结构
首先要清楚ORB-SLAM视觉跟踪的原理,然后对tracking.cc中的函数逐个讲解 代码的前面部分是从配置文件中读取校准好的相机参数(内参和畸变参数,以及双目的深度测量设定),并且加载ORB特征点 ...