题意:

给定一个数n,选出m个数使得 \(\Pi_{i=1}^m a_i\ge n\),求\(\sum_{i=1}^m a_i\)的最小值 ,其中\(m\)的大小不限

\(n\)的长度\(\le 10^6\)

简单的计算可以发现 我们要尽量多的选\(3\) 在最后特别逼近的时候 会有 \(3^x\times2,3^x\times3,3^x\times4\)三种选择

于是我们可以先求出一个逼近\(n\)的形如\(3^x\)的数\(T\),之后暴力枚举三种情况,只要\(T\ge n\)则跳出 否则\(T=T*3\)继续枚举

对于一开始求出\(T=3^x\)的过程 我们可以发\(x\le log_3 n=len(n)*log_310\) 求出\(x\)后可以通过 \(FFT\)+快速幂求出\(T\)

具体的复杂度不太会分析 我在实现时压了\(2\)位 看到别人有跑得飞快 开始怀疑是假做法了o(╥﹏╥)o

#include<bits/stdc++.h>
using namespace std;
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define pa pair<int,int>
#define mod 1000000007
#define ll long long
#define mk make_pair
#define pb push_back
#define fi first
#define se second
#define cl(x) memset(x,0,sizeof x)
#ifdef Devil_Gary
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
const int INF = 0x7fffffff;
const int N=3e6+5;
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
inline int read(){
int x=0,rev=0,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return rev?-x:x;
}
const int Mod=100;
int ans,K,ls;
int M,l,r[N];
char ss[N]; vector<int>s,g,f;
const double pi = acos(-1.0);
struct Cp{
double x,y;
Cp (double _x=0, double _y=0) {x=_x,y=_y;}
Cp operator + (const Cp& rhs) {return Cp(x+rhs.x,y+rhs.y);}
Cp operator - (const Cp& rhs) {return Cp(x-rhs.x,y-rhs.y);}
Cp operator * (const Cp& rhs) {return Cp(x*rhs.x-y*rhs.y,x*rhs.y+y*rhs.x);}
}A[N],B[N],x,w,w0;
inline void FFT(Cp *A,int f) {
int i,j,k;
for(i=0;i<M;i++) if(i<r[i]) swap(A[i],A[r[i]]);
for(i=1;i<M;i<<=1) {
w.x=cos(pi/i),w.y=sin(pi/i)*f;
for(j=0;j<M;j+=i<<1) {
w0.x=1,w0.y=0;
for(k=0;k<i;++k) {
x=A[j+k];
A[j+k]=x+(w0*A[i+j+k]);
A[i+j+k]=x-(w0*A[i+j+k]);
w0=w0*w;
}
}
}
if(f==-1) for(i=0;i<M;++i) A[i].x/=M;
} void stretch(vector<int>&a){
int p=0,la=a.size();
for (int i=0;i<la||p;++i) {
if(i>=la) a.pb(0);
ll cur=a[i]+p;
a[i]=cur%Mod;
p=cur/Mod;
}
}
bool cmp(vector<int>a){
int la=a.size(),lb=s.size();
if(la<lb) return 0;
if(la>lb) return 1;
for(int i=la-1;~i;i--) {
if(a[i]<s[i]) return 0;
if(a[i]>s[i]) return 1;
}
return 1;
}
bool work(int x){
vector<int>h;
for(int i=0;i<g.size();i++) h.pb(g[i]*x);
stretch(h);
// for(int i=0;i<h.size();i++) cout<<h[i]<<" ";cout<<endl;
return cmp(h);
}
void solve2(){
for(int i=0;i<g.size();i++) g[i]=g[i]*3;
stretch(g);
}
//calc 3^n
vector<int> solve(vector<int>a,vector<int>b){
int la=a.size(),lb=b.size();
// for(int i=0;i<a.size();i++) cout<<a[i]<<" ";cout<<endl;
// for(int i=0;i<b.size();i++) cout<<b[i]<<" ";cout<<endl;
// bug(la),bug(lb);
for(M=1,l=0;M<=la+lb;M<<=1,l++);
for(int i=0;i<a.size();i++) A[i].x=a[i],A[i].y=0;
for(int i=0;i<b.size();i++) B[i].x=b[i],B[i].y=0;
for(int i=1;i<M;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
FFT(A,1),FFT(B,1);
for(int i=0;i<M;i++) A[i]=A[i]*B[i];
FFT(A,-1);
vector<int>z(la+lb-1);
for(int i=0;i<=la+lb-2;i++) z[i]=(int)(A[i].x+0.5);
for(int i=0;i<M;i++) A[i].x=B[i].x=A[i].y=B[i].y=0;
// for(int i=0;i<z.size();i++) cout<<z[i]<<" ";cout<<endl;
return z;
}
void calc(){
f.pb(3),g.pb(1);
while(K){
if(K&1) g=solve(g,f),stretch(g);
K>>=1,f=solve(f,f),stretch(f);
}
}
int tt[10]={0,1,2,3,4,5,5,6,6,6};
int main(){
#ifdef Devil_Gary
freopen("in.txt","r",stdin);
#endif
scanf("%s",ss),ls=strlen(ss),reverse(ss,ss+ls);
if(ls==1){
int zjq=ss[0]-'0'; return cout<<tt[zjq]<<endl,0;
}
for(int i=0;i<ls;i+=2) {
int x=ss[i]-'0';
if(i+1<ls) x+=(ss[i+1]-'0')*10;
// if(i+2<ls) x+=(ss[i+2]-'0')*100;
s.pb(x);
}
K=(ls-1)*(double)(log(10)/log(3)),--K,ans+=K*3,calc();
int ans2=ans;
// for(int i=0;i<s.size();i++) cout<<s[i]<<" ";cout<<endl;
for(;;ans+=3,solve2()){
// for(int i=0;i<g.size();i++) cout<<g[i]<<" ";bug(ans),cout<<endl;
if(work(2)) {ans+=2;break;}
else if(work(3)) {ans+=3;break;}
else if(work(4)) {ans+=4;break;}
}
cout<<ans<<endl;
}

Codeforces 986D Perfect Encoding FFT的更多相关文章

  1. Codeforces 986D Perfect Encoding FFT 分治 高精度

    原文链接https://www.cnblogs.com/zhouzhendong/p/9161557.html 题目传送门 - Codeforces 986D 题意 给定一个数 $n(n\leq 10 ...

  2. Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)

    题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...

  3. [Codeforces 580D]Fizzy Search(FFT)

    [Codeforces 580D]Fizzy Search(FFT) 题面 给定母串和模式串,字符集大小为4,给定k,模式串在某个位置匹配当且仅当任意位置模式串的这个字符所对应的母串的位置的左右k个字 ...

  4. Codeforces 980D Perfect Groups 计数

    原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...

  5. Codeforces.528D.Fuzzy Search(FFT)

    题目链接 \(Descripiton\) 给出文本串S和模式串T和k,S,T为DNA序列(只含\(A,T,G,C\)).对于S中的每个位置\(i\),只要\(s[i-k]\sim s[i+k]\)中有 ...

  6. [CodeForces - 919B] Perfect Number

    题目链接:http://codeforces.com/problemset/problem/919/B AC代码: #include<cstdio> using namespace std ...

  7. Codeforces 948D Perfect Security(字典树)

    题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...

  8. 【codeforces 623E】dp+FFT+快速幂

    题目大意:用$[1,2^k-1]$之间的证书构造一个长度为$n$的序列$a_i$,令$b_i=a_1\ or\ a_2\ or\ ...\ or a_i$,问使得b序列严格递增的方案数,答案对$10^ ...

  9. CodeForces - 528D Fuzzy Search (FFT求子串匹配)

    题意:求母串中可以匹配模式串的子串的个数,但是每一位i的字符可以左右偏移k个位置. 分析:类似于 UVALive -4671. 用FFT求出每个字符成功匹配的个数.因为字符可以偏移k个单位,先用尺取法 ...

随机推荐

  1. SHELL (3) —— 变量知识进阶和实践

    摘自:Oldboy Linux运维——SHELL编程实战 SHELL中特殊切重要的变量 位置变量 作用说明 $0 获取当前执行的Shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径 $n ...

  2. bzoj千题计划181:bzoj1878: [SDOI2009]HH的项链

    http://www.lydsy.com/JudgeOnline/problem.php?id=1878 之前用莫队做的,现在用树状数组 把每种数的第一个出现位置在树状数组中+1 nxt[i] 记录i ...

  3. SpringMvc数据校验@Valid等注解的使用与工具类抽取

    最近在重构老项目的代码,发现校验入参占用了很多代码,之前我对这一块的认识局限于使用StringUtils等工具来多个if块进行判断,代码是没什么问题,但是总写这些令人生烦,毕竟写代码也要讲究优雅的嘛, ...

  4. [软件]Xcode查找系统framework所在路径

    有的时候, 我们不小心改了头文件, 导致Xcode系统库被修改(改回去也不行) 假设我改的是UIKit.framework类库里面的一个文件, 那么你只需要从另一个好使的电脑上, 在这个路径找到UIK ...

  5. 【CodeForces】925 C.Big Secret 异或

    [题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...

  6. Vue模板语法V-bind

    一.插值 1.文本 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  7. HDU 6406 Taotao Picks Apples 线段树维护

    题意:给个T,T组数据: 每组给个n,m:n个数,m个操作: (对序列的操作是,一开始假设你手上东西是-INF,到i=1时拿起1,之后遍历,遇到比手头上的数量大的数时替换(拿到手的算拿走),问最后拿走 ...

  8. 记一次ThreadPoolExecutor面试

    ThreadPoolExecutor点滴 线程池应该也是面试绕不开的一个点,平时大家也没少用,但其实也有一些小Tips还是值得记录一下. Constructor public ThreadPoolEx ...

  9. Twisted框架

    Twisted是一个事件驱动型的网络模型.时间驱动模型编程是一种范式,这里程序的执行流由外部决定.特点是:包含一个事件循环,当外部事件发生时,使用回调机制来触发相应的处理. 线程模式: 1.单线程同步 ...

  10. linux设备驱动归纳总结(三):3面向对象思想和lseek、container_of、write、read 【转】

    linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 转自:http://blog.chinaunix.net/uid-25014876-id-59418.html 一.结构体 ...