Codeforces 986D Perfect Encoding FFT
题意:
给定一个数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的更多相关文章
- Codeforces 986D Perfect Encoding FFT 分治 高精度
原文链接https://www.cnblogs.com/zhouzhendong/p/9161557.html 题目传送门 - Codeforces 986D 题意 给定一个数 $n(n\leq 10 ...
- Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)
题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...
- [Codeforces 580D]Fizzy Search(FFT)
[Codeforces 580D]Fizzy Search(FFT) 题面 给定母串和模式串,字符集大小为4,给定k,模式串在某个位置匹配当且仅当任意位置模式串的这个字符所对应的母串的位置的左右k个字 ...
- Codeforces 980D Perfect Groups 计数
原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...
- 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]\)中有 ...
- [CodeForces - 919B] Perfect Number
题目链接:http://codeforces.com/problemset/problem/919/B AC代码: #include<cstdio> using namespace std ...
- Codeforces 948D Perfect Security(字典树)
题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...
- 【codeforces 623E】dp+FFT+快速幂
题目大意:用$[1,2^k-1]$之间的证书构造一个长度为$n$的序列$a_i$,令$b_i=a_1\ or\ a_2\ or\ ...\ or a_i$,问使得b序列严格递增的方案数,答案对$10^ ...
- CodeForces - 528D Fuzzy Search (FFT求子串匹配)
题意:求母串中可以匹配模式串的子串的个数,但是每一位i的字符可以左右偏移k个位置. 分析:类似于 UVALive -4671. 用FFT求出每个字符成功匹配的个数.因为字符可以偏移k个单位,先用尺取法 ...
随机推荐
- 2018年9月28日CCPC秦皇岛站参赛总结
day1: 被中间结果超出int范围给叉了,立刻意识到了自己的弱小以及校赛出题的时候是怎么叉别人的 day2: 签到签了40分钟,谨慎一些还是很好的,机子重启耽误了一些时间 一道暴力+LCS的简单题被 ...
- WebViewJavascriptBridge测试示例
android或ios:app与html5通信解决方案 下面只是前端示例代码,后端代码请参考: git https://github.com/marcuswestin/WebViewJavascrip ...
- html5 canvas高级贝塞尔曲线运动动画(好吧这一篇被批的体无完肤!都说看不懂了!没办法加注释了!当然数学不好的我也没办法了,当然这还涉及到一门叫做计算机图形学的学科)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- springMvc + Maven 项目提示 hessian 依赖包 无法下载;
首先 从 https://github.com/alibaba/dubbo/archive/master.zip 下载最新的 dubbo 源码包到本地某个目录, 解压出来: cmd 进入该目录: 执行 ...
- CSS-3 新弹性盒模型属性
flex 语法:flex:none | [ flex-grow ] || [ flex-shrink ] || [ flex-basis ] 取值: none:none关键字的计算值为: 0 0 au ...
- 20155211 2016-2017-2 《Java程序设计》第六周学习总结
20155211 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 第十章 输入/输出 一.InputStream与OutputStream (一)串流设计的概 ...
- 第10月第20天 afnetwork like MKNetworkEngine http post
1. + (AFHTTPRequestOperation *)requestSellerWithCompletion:(requestFinishedCompletionBlock)successBl ...
- ApiCloud利用NVTabBar模块快速搭建起APP的框架
废话不说,直接上代码 模块地址:https://docs.apicloud.com/Client-API/Nav-Menu/NVTabBar 代码实例: <!doctype html> & ...
- Caffe学习系列(17): blob
对于blob.h文件. 先看成员变量.定义了6个保护的成员变量,包括前.后向传播的数据,新.旧形状数据(?), 数据个数及容量. 再看成员函数.包括构造函数(4个参数),reshape(改变blob形 ...
- 详解使用 Tarjan 求 LCA 问题(图解)
LCA问题有多种求法,例如倍增,Tarjan. 本篇博文讲解如何使用Tarjan求LCA. 如果你还不知道什么是LCA,没关系,本文会详细解释. 在本文中,因为我懒为方便理解,使用二叉树进行示范. L ...