Codeforces 986D Perfect Encoding FFT 分治 高精度
原文链接https://www.cnblogs.com/zhouzhendong/p/9161557.html
题目传送门 - Codeforces 986D
题意
给定一个数 $n(n\leq 10^{1500000})$ , 求满足 $(\prod b_i)\geq n$ 的 $\min(\sum b_i)$ 。
题解
这题是下面链接中那题的加强版。
这题的做法是预估出大概有多少个 $3$ ,然后最后几个数一个一个加上去就可以了。
至于求 $3$ 的快速幂,要用FFT优化。
时间复杂度:
$$T(m)=T(m/2)+m\log m=m\log m$$
其中这里的 $m$ 与输入的 $n$ 的位数同阶。
注意点:
1. 本题卡常,要压位,我压了3位,但是2位好像也可以过。
2. 注意一下 $n=1$ 的情况。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=(1<<21)+1;
const double PI=acos(-1.0);
int m;
char s[N];
int bit=1000;
struct Big{
int len;
LL a[N];
void clear(){
len=0;
memset(a,0,sizeof a);
}
void print(){
for (int i=len;i>=1;i--)
printf("%03d",(int)a[i]);
puts("");
}
bool operator >= (Big &x){
if (len!=x.len)
return len>x.len;
for (int i=len;i>=1;i--)
if (a[i]!=x.a[i])
return a[i]>x.a[i];
return 1;
}
void pushbits(){
for (int i=1;i<=len;i++)
a[i+1]+=a[i]/bit,a[i]%=bit;
while (a[len+1]){
len++;
a[len+1]=a[len]/bit;
a[len]%=bit;
}
}
void operator *= (int x){
for (int i=1;i<=len;i++)
a[i]*=x;
pushbits();
}
}n,x,tmp;
struct C{
double r,i;
C(){}
C(double _r,double _i){r=_r,i=_i;}
C operator + (C x){return C(r+x.r,i+x.i);}
C operator - (C x){return C(r-x.r,i-x.i);}
C operator * (C x){return C(r*x.r-i*x.i,r*x.i+i*x.r);}
}A[N],B[N],w[N];
int R[N];
void FFT(C a[],int n){
for (int i=0;i<n;i++)
if (R[i]>i)
swap(a[i],a[R[i]]);
for (int t=n>>1,d=1;d<n;d<<=1,t>>=1)
for (int i=0;i<n;i+=(d<<1))
for (int j=0;j<d;j++){
C tmp=w[t*j]*a[i+j+d];
a[i+j+d]=a[i+j]-tmp;
a[i+j]=a[i+j]+tmp;
}
}
void Times (Big &a,Big &b,Big &c){
int n,d;
for (n=1,d=0;n<a.len+b.len;n<<=1,d++);
for (int i=0;i<n;i++){
R[i]=(R[i>>1]>>1)|((i&1)<<(d-1));
w[i]=C(cos(PI*2*i/n),sin(PI*2*i/n));
A[i]=B[i]=C(0,0);
}
for (int i=1;i<=a.len;i++)
A[i-1].r=a.a[i];
for (int i=1;i<=b.len;i++)
B[i-1].r=b.a[i];
FFT(A,n),FFT(B,n);
for (int i=0;i<n;i++)
A[i]=A[i]*B[i],w[i].i*=-1.0;
FFT(A,n);
c.clear();
for (int i=0;i<n;i++)
c.a[i+1]=(LL)(A[i].r/n+0.5);
c.len=n;
while (c.a[c.len]==0&&c.len>1)
c.len--;
c.pushbits();
}
void Pow(int y){
if (y==0){
x.clear();
x.a[x.len=1]=1;
return;
}
Pow(y/2);
Times(x,x,x);
if (y&1)
x*=3;
}
bool check(Big &x,int y){
tmp=x;
tmp*=y;
return tmp>=n;
}
int main(){
scanf("%s",s+1);
n.len=strlen(s+1);
int pw10[3]={1,10,100};
for (int i=1;i<=n.len;i++)
n.a[(n.len-i+1-1)/3+1]+=pw10[(n.len-i)%3]*(s[i]-'0');
m=max(0,(int)(n.len*log(10)/log(3))-3);
n.len=(n.len-1)/3+1;
if (n.len==1&&n.a[1]==1){
puts("1");
return 0;
}
Pow(m);
while (1){
for (int i=2;i<=4;i++)
if (check(x,i)){
printf("%d",m*3+i);
return 0;
}
x*=3;
m++;
}
return 0;
}
Codeforces 986D Perfect Encoding FFT 分治 高精度的更多相关文章
- 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$ 简单的计算 ...
- Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)
题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...
- SPOJ - VFMUL - Very Fast Multiplication FFT加速高精度乘法
SPOJ - VFMUL:https://vjudge.net/problem/SPOJ-VFMUL 这是一道FFT求高精度的模板题. 参考:https://www.cnblogs.com/Rabbi ...
- P1919 FFT加速高精度乘法
P1919 FFT加速高精度乘法 传送门:https://www.luogu.org/problemnew/show/P1919 题意: 给出两个n位10进制整数x和y,你需要计算x*y. 题解: 对 ...
- [Codeforces 580D]Fizzy Search(FFT)
[Codeforces 580D]Fizzy Search(FFT) 题面 给定母串和模式串,字符集大小为4,给定k,模式串在某个位置匹配当且仅当任意位置模式串的这个字符所对应的母串的位置的左右k个字 ...
- hdu5197 DZY Loves Orzing(FFT+分治)
hdu5197 DZY Loves Orzing(FFT+分治) hdu 题目描述:一个n*n的矩阵里填入1~n^2的数,要求每一排从前往后能看到a[i]个数(类似于身高阻挡视线那种),求方案数. 思 ...
- hdu5322 Hope(dp+FFT+分治)
hdu5322 Hope(dp+FFT+分治) hdu 题目大意:n个数的排列,每个数向后面第一个大于它的点连边,排列的权值为每个联通块大小的平方,求所有排列的权值和. 思路: 考虑直接设dp[i]表 ...
- CodeForces 553E Kyoya and Train 动态规划 多项式 FFT 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8847145.html 题目传送门 - CodeForces 553E 题意 一个有$n$个节点$m$条边的有向图 ...
- 挑选队友 (生成函数 + FFT + 分治)
链接:https://www.nowcoder.com/acm/contest/133/D来源:牛客网 题目描述 Applese打开了m个QQ群,向群友们发出了组队的邀请.作为网红选手,Applese ...
随机推荐
- Android设备管理器——DevicePolicyManager
自从安卓2.2(API=8)以后,安卓手机是通过设备管理API对手机进行系统级的设备管理. 本篇通过大家熟悉的"一键锁屏"的小项目实现来介绍设备管理API如何通过强制设备管理策略创 ...
- Uva 11178 Morley定理
题意: 给你三角形三个点, 定理是 三个内角的三等分线相交得出 DEF三点, 三角新 DFE是等边三角形 然后要你输出 D E F 的坐标 思路 : 求出三个内角,对于D 相当于 BC向量逆时针旋转, ...
- MR1和MR2(Yarn)工作原理流程
一.Mapreduce1 图1 MR1工作原理图 工作流程主要分为以下6个步骤: 1 作业的提交 1)客户端向jobtracker请求一个新的作业ID(通过JobTracker的getNewJobI ...
- 根据CAS协议写的简单的SSO框架
前言: 考虑到现在分布式应用都不可或缺的一个重要部分:单点登录,决定花点时间去学下.本来想直接上现成的CAS框架的,初步的了解了一下后,觉得这个太庞大了,而且不好定制,要完全深度用起来也没那么简单 ...
- 来,了解一下Java内存模型(JMM)
网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...
- with文件操作
enumeratef = open('lyrics',"r",encoding=""utf-8) #文件句柄"""对文件操作流程 ...
- linux和windows下,C/C++开发的延时函数,sleep函数
简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 在VC中使用带上头文件 #include < ...
- python之路第二天
为何要有操作系统 为了让程序员更轻松的完成命令电脑工作而存在的,控制硬件,服务于软件. 操作系统的位置 操作系统位于软件和硬件之间.操作系统由内核(运行于内核态,控制硬件)和系统调用(运行于用户态,为 ...
- Django中各目录文件的作用
一般的项目结构如下(大同小异) my_site是一个项目,blog是项目下的应用之一,可以使用创建命令创建更多的应用. 最上层的django文件夹: 自己手动创建,名字随意. 第二层my_site文件 ...
- Jumpserver里常用的sudo权限控制模板
ALL,!/bin/bash,!/bin/tcsh,!/bin/su,!/usr/bin/passwd,!/usr/bin/passwd root,!/bin/vim /etc/sudoers,!/u ...