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个单位,先用尺取法 ...
随机推荐
- Spark记录-Spark作业调试
在本地IDE里直接运行spark程序操作远程集群 一般运行spark作业的方式有两种: 本机调试,通过设置master为local模式运行spark作业,这种方式一般用于调试,不用连接远程集群. 集群 ...
- Spark记录-Scala函数与闭包
函数声明 Scala函数声明具有以下形式 - def functionName ([list of parameters]) : [return type] Scala 如果不使用等号和方法体,则隐式 ...
- php银行卡校验
前言银行金卡,维萨和万事达.银联品牌,如果是贷记卡或准贷记卡,一定为16位卡号.而借记卡可以16-19位不等.美国运通卡则不论金卡或是白金卡.普通卡,都是15位卡号.16-19 位卡号校验位采用 Lu ...
- Docker学习笔记二 使用镜像
本文地址:https://www.cnblogs.com/veinyin/p/10408363.html Docker运行容器前,需本地存在对应镜像,若没有则Docker从镜像仓库下载该镜像. 镜 ...
- Spark笔记之使用UDAF(User Defined Aggregate Function)
一.UDAF简介 先解释一下什么是UDAF(User Defined Aggregate Function),即用户定义的聚合函数,聚合函数和普通函数的区别是什么呢,普通函数是接受一行输入产生一个输出 ...
- FPGA学习笔记. DDS
DDS原理 直接数字式频率合成器(Direct Digital Synthesizer) 频率计算公式 Fout = FW * Fclk / 2^N Fout 输出频率, Fw 频率控制字, N 位数 ...
- Ettercap之ARP+DNS欺骗
1.网络攻击拓扑环境 网关:192.168.133.2 攻击者:192.168.133.128 受害者:192.168.133.137 2.原理讲解 ARP欺骗 简介:ARP(Address Reso ...
- struct termios结构体详解
一.数据成员 termios 函数族提供了一个常规的终端接口,用于控制非同步通信端口. 这个结构包含了至少下列成员:tcflag_t c_iflag; /* 输入模式 */tcflag_t ...
- linux du查询目录所占的磁盘空间
linux查询目录所占的磁盘空间 du -hxs /* --exclude=/proc |sort -rh 命令和选项的解释: du – 估计文件的空间使用情况 -hsx – (-h)更易读的格式,( ...
- C# Json To Object 无废话
json字符串如下: { success : 0, errorMsg : "错误消息", data : { total : "总记录数", rows : [ { ...