题目大意:给定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的更多相关文章

  1. CF#345 (Div1)

    论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...

  2. 图论 SRM 674 Div1 VampireTree 250

    Problem Statement      You are a genealogist specializing in family trees of vampires. Vampire famil ...

  3. jq对象转为dom对象:$(".div1")[0] dom对象转为jq对象:$(dom对象)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  4. 第一次div1做出3道题

    第一次div1做出3道题! 再接再厉! 哈利路亚!

  5. 第一次进div1了

    第一次进div1~好激动啊! 上帝依旧那么眷顾我!

  6. TopCoder 649 div1 & div2

    最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...

  7. 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 ...

  8. codeforces #305 div1 done

    总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...

  9. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

随机推荐

  1. Linux给当前用户指定目录授权命令

    使用命令: chown -R user:user ./local 说明:user 为当前用户: 完毕!

  2. Linux 系统无法登录?你的程序有问题吧!

    今天遇到一个问题,有个用户连接不上服务器(无法ssh远程连接) su: failed to execute /bin/bash: Resource temporarily unavailable 谷歌 ...

  3. 二、Django需要的知识点

    1.请求(request): 客户端到服务器端. 响应(response):服务器端到客户端. HTTP/1.1 协议共定义了 8 种请求方式,分别是: OPTIONS. HEAD. GET. POS ...

  4. python 使用生成器 来完成 监听文件输入的例子

    def tail(filename):#函数 f = open(filename,encoding='utf-8') while True: line = f.readline() if line.s ...

  5. Spark Streaming实时处理应用

    1 框架一览   事件处理的架构图如下所示. 2 优化总结   当我们第一次部署整个方案时,kafka和flume组件都执行得非常好,但是spark streaming应用需要花费4-8分钟来处理单个 ...

  6. 编译net core时nuget里全部报错,\obj\project.assets.json找不到

    除了Nuget管理设置允许下载缺少的程序包 如果你自己设置的程序包源里有一个源访问不到,则可能出现下面错误,导致所有nuget无法还原. 而且在VS2017里不会出现这个 SDK,特别是你网上下载的其 ...

  7. Java中的IO流体系

    Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图10-7所示,为Java中IO流类的体系. 注:这里只列出常用的类,详情可以参考JDK API文档.粗体标注 ...

  8. Flask 中文手册 0.10 文档

    Flask 中文手册 0.10 文档 欢迎使用 Flask 欢迎阅读 Flask 文档. 本文档分为几个部分.我推荐您先从 安装 开始,之后再浏览 快速入门 章节. 教程 比快速入门更详细地介绍了如何 ...

  9. Apache 配置说明

    ServerRoot ServerRoot: The top of the directory tree under which the server's configuration, error, ...

  10. Django笔记 —— 基础部分总结

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...