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 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
随机推荐
- unity独立游戏开发日志2018/09/26
最近太忙,今天吃饭的时候灵感一现...想到了随机地图生成的方法,不过可能实现的比较笨...还需要优化,大佬绕过. 注释没打,最后统一解释. using System.Collections; usin ...
- R语言学习笔记(八):零碎知识点(16-20)
16--complete.cases( ) complete.case()可以判断对象中是否数据完全,然后返回TRUE, FALSE 这一函数在去除数据框中缺失值时很有用. > d kids a ...
- shell -- for、while用法
#数字段形式for i in {1..10}do echo $idone #详细列出(字符且项数不多)for File in 1 2 3 4 5do echo $Filedone #对存在的 ...
- C#窗口抖动
用过QQ的窗口抖动功能吧.是不是觉得很神奇?很有意思?其实,仔细想想,使用的原理还是挺简单的:让窗口的位置不断快速地发生变化. 说出了原理,是不是一下恍然大悟?顿时理解了.我以前也想过如何实现这个功能 ...
- linux手动安装flash插件
下载好之后,将解压的文件 1,将libflashplayer.so拷到firefox的插件目录/usr/lib/firefox/browser/plugin/ sudo cp libflashplay ...
- MySQL数据库服务器逐渐变慢分析
第一步 检查系统的状态 1.1 使用sar来检查操作系统是否存在IO问题 #sar -u 2 10 — 即每隔2秒检察一次,共执行20次. [root@CacheMemCache tester]# s ...
- 如何从“点子”落地到“执行”?—完整解析1个手游传播类mini项目的进化
本文来自网易云社区 作者:林玮园 从点子到落地,是不确定到确定的过程,是从模糊概念到具体现实的实现过程.无论什么点子,在落地变现的过程中都会有很多疑问产生. 首先,不确定点子本身是否成立.点子的背后是 ...
- PostgreSQL 数据库升级
PostgreSQL软件版本升级后,需要使用pg_upgrade迁移旧版本的数据库,具体的操作参数可以参考官方文档,在此记录一下操作过程中出现的细节问题: 新版本软件在initdb的时候要保证loca ...
- 【廖雪峰老师python教程】——装饰器
装饰器 # 一个函数装饰器的列子 def log(func): def wrapper(*args,**kwargs): print('Name=%s'%func.__name__) return f ...
- MySQL高可用之PXC安装部署
Preface Today,I'm gonna implement a PXC,Let's see the procedure. Framework Hostname IP P ...