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个单位,先用尺取法 ...
随机推荐
- hdu 5181 numbers
http://acm.hdu.edu.cn/showproblem.php?pid=5181 题意: 有一个栈,其中有n个数1~n按顺序依次进入栈顶,在某个时刻弹出. 其中m个限制,形如数字A必须在数 ...
- Sublime Text 3 绿色汉化版 x64
之前做了<Sublime Text 2 绿色汉化版 x64>,这些天抽空做了下 ST3 的汉化.. 果然我没有任何理由爱上 ST3,不仅pojie麻烦,而且汉化更麻烦,菜单字符长度做了限制 ...
- 自己动手开发Socks5代理服务器
一.Socks5协议简介 socks5是基于传输层的协议,客户端和服务器经过两次握手协商之后服务端为客户端建立一条到目标服务器的通道,在传输层转发TCP/UDP流量. 关于socks5协议规范,到处都 ...
- 如何提升mysql replication的性能&多线程传输二进制日志
1,最好使用内网或者专线链路传输binlog数据 (千兆网卡.还不够的话,bounding 技术,扩展带宽) 在my.cnf中强制使用内网ip传输数据bind-address=ip2,将二进制保存在独 ...
- TensorBoard 简介及使用流程【转】
转自:https://blog.csdn.net/gsww404/article/details/78605784 仅供学习参考,转载地址:http://blog.csdn.net/mzpmzk/ar ...
- Axure RP Pro 7.0
Axure RP Pro专为Rapid Prototype Design而生,它可以辅助产品经理快速设计完整的产品原型,并结合批注.说明以及流程图.框架图等元素将产品完整地表述给各方面设计人员,如UI ...
- 利用CSS改变输入框的光标颜色
转:http://www.cnblogs.com/gymmer/p/6810367.html 代码: <!DOCTYPE html> <html lang="en" ...
- 数组中累加和小于等于k的最长子数组
问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...
- Hazelcast是什么
Hazelcast是什么 “分布式”.“集群服务”.“网格式内存数据”.“分布式缓存“.“弹性可伸缩服务”——这些牛逼闪闪的名词拿到哪都是ITer装逼的不二之选.在Javaer的世界,有这样一个 ...
- ***PHP $_FILES函数详解 + PHP文件上传 move_uploaded_file() 参数的正确写法
PHP $_FILES函数详解 在PHP中上传一个文件建一个表单要比ASP中灵活得多.具体的看代码. 如: 复制代码代码如下: <form enctype="multipart/fo ...