/*
Migrated from Lutece 1264 人民币的构造
Description
我们都知道人民币的面值是1、2、5、10,为什么是这个数值呢,我们分析了下发现,
从1−10的每个数字都可以由每种面值选出至多一张通过加法和减法(找钱)来构成,
(比如:1+2=3,5−1=4,5+1=6,5+2=7,1+2+5=8,10−1=9)
但是实际上,我们只需要1、2、7三种面值就可以组成1−10的每一个数字了(1+2=3,7−1−2=4,7−2=5,7−1=6,7+1=8,7+2=9,7+1+2=10)
那么现在问题来了,给一个数n,请问最少需要多少种不同的面值就可以构成从1−n的所有数字,
注意在构成每一个数字时同种面值不能超过1张。
Input
一个数字n(1<=n<=100000)
Output
一个数字,代表最少需要多少种不同的面值可以构成从1−n的所有数字。
*///人民币竟然有2元的面值吗(○´・д・)ノ//等比数列求和公式, 首项a,公比r,项数k
//前k项和为S = a*(r^k-1)/(r-1)
//S = a+a*r+a*r^2+...+a*r^(k-1)
//r*S = 0 + a*r+a*r^2+a*r^3+...+a*r^(k-1)+a*r^k = S-a+a*r^k
//S*(r-1) = a*(r^k-1)
//S = a*(r^k-1)/(r-1)
//首项a,末项b,公比r
//S = (br-a)/(r-1)//1+3+9+...+3^k = (3^(k+1)-1)/2//1 --> 1//[x-1,x,x+1]
//1,3 --> 1,[2,3,4] //1+3=4//[x-3-1,x-3,x-3+1,x-1,x,x+1,x+3-1,x+3,x+3+1] //9 = 1+2*4
//1,3,9 --> 1,[2,3,4],[5,6,7,8,9,10,11,12,13] //1+3+9=13//1,3,9,...,3^(k-1) --> 1,2,3,...,3^(k-1)+(1+3+9+...+3^(k-2))=3^(k-1)+(3^(k-1)-1)/2 = (3^k-1)/2#include <iostream>
#include <cmath>
int main(){int n;std::cin>>n;//(3^k-1)/2 >= n//3^k>=2n+1//k>=log3(2n+1)double k = std::log(2*n+1)/std::log(3);//std::log(x)计算以e为底的对数//e^(k*log(3)) = 2n+1//(e^log(3))^k = 3^k = 2n+1//换底公式: logA(x) = logB(x)/logB(A)//B^i = x,B^j = A//A^i = B^(ij) = x^j//A^(i/j) = B^i = xstd::cout<<int(k)+int((k-int(k))>0)<<std::endl;
}