题意:

给定一个数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. Spark记录-spark编程介绍

    Spark核心编程 Spark 核心是整个项目的基础.它提供了分布式任务调度,调度和基本的 I/O 功能.Spark 使用一种称为RDD(弹性分布式数据集)一个专门的基础数据结构,是整个机器分区数据的 ...

  2. Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) F 构造

    http://codeforces.com/contest/967/problem/F 题目大意: 有n个点,n*(n-1)/2条边的无向图,其中有m条路目前开启(即能走),剩下的都是关闭状态 定义: ...

  3. Mogodb 学习一

    0.MongoDB和关系型数据的几个重要对象对比 MongoDB中的数据库.集合.文档 类似于关系型数据库中的数据库.表.行 MongoDB中的集合是没有模式的,所以可以存储各种各样的文档 1.启动M ...

  4. 玩转Hook——Android权限管理功能探讨(一)

    随着Android设备上的隐私安全问题越来越被公众重视,恶意软件对用户隐私,尤其是对电话.短信等私密信息的威胁日益突出,各大主流安全软件均推出了自己的隐私行为监控功能,在root情况下能有效防止恶意软 ...

  5. js和jquery使按钮失效为不可用状态的方法

    设置disabled属性为true即为不可用状态. html代码: <input type="button" value="提交" id="bt ...

  6. python 入门基础23 选课系统 项目

    选课系统 代码地址:github_code # 选课系统 # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个 ...

  7. Dream_Spark定制第二课

    Spark版本定制第2天:通过案例对SparkStreaming透彻理解之二 本期内容: 1 解密Spark Streaming运行机制 2 解密Spark Streaming架构 一切不能进行实时流 ...

  8. Maven从私服上下载所需jar包——(十四)

    1.修改settings.xml 将下面代码添加到settings.xml中 <profile> <!--profile的id--> <id>dev</id& ...

  9. PHP中冒号、endif、endwhile、endfor使用介绍

    我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: 复制代码代码如下: <?php if(empty($GET_['a'])): ?> <font c ...

  10. Codeforces 671A Recycling Bottles(贪心+思维)

    题目链接:http://codeforces.com/problemset/problem/671/A 题目大意:给你两个人的位置和一个箱子的位置,然后给出n个瓶子的位置,要求让至少一个人去捡瓶子放到 ...