[bzoj3287] Mato的刷屏计划
2016-03-14 20:19
253 查看
第一眼以为是傻逼斜率优化>_<
f[i]表示按i次最多可输出字符数。。f[i]=max{ f[i-1]+1,(i-j-1)*f[j] },j<i-2
结果n在100+的时候就喜闻乐见地爆了longlong
根据网上题解可得(T_T)。。这题大概是要FFT优化?(跟着ccz大爷刷题果然高风险TAT
然而题解表示,这题求出f的前几项后,令x=n%5+15,最终答案f
=f[x]*4^((n-x)/5)..........
我死活没看出来这是为啥。。。
我显然是连FFT都不会的傻逼。。只好写了个压位高精度快速幂。。结果跑了#3。。233
突然觉得正解显然不是FFT = =。。另外status里面一堆奇怪语言也是感人>_<
View Code
f[i]表示按i次最多可输出字符数。。f[i]=max{ f[i-1]+1,(i-j-1)*f[j] },j<i-2
结果n在100+的时候就喜闻乐见地爆了longlong
根据网上题解可得(T_T)。。这题大概是要FFT优化?(跟着ccz大爷刷题果然高风险TAT
然而题解表示,这题求出f的前几项后,令x=n%5+15,最终答案f
=f[x]*4^((n-x)/5)..........
我死活没看出来这是为啥。。。
我显然是连FFT都不会的傻逼。。只好写了个压位高精度快速幂。。结果跑了#3。。233
突然觉得正解显然不是FFT = =。。另外status里面一堆奇怪语言也是感人>_<
#include<cstdio> #include<iostream> #include<cstring> #define ll long long #define d double using namespace std; const int maxn=1002333; const int modd=1000000000; ll f[233]; int dl[maxn],l,r; ll a[32333],c[32333],b[32333]; int i,j,k,n,m,lena,lenc; inline d xl(int k,int j){//k<j<i-2 return ( f[j]*(j+1)-f[k]*(k+1) )/ (d)(f[j]-f[k]); } int ra,fh;char rx; inline int read(){ rx=getchar(),ra=0,fh=1; while((rx<'0'||rx>'9')&&rx!='-')rx=getchar(); if(rx=='-')fh=-1,rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh; } inline void multoa(){ register int i,j,k; memset(b,0,(lena*2+1)<<3); for(i=1;i<=lena;i++)for(j=1,k=i;j<=lena;j++,k++){ b[k]+=a[i]*a[j]; if(b[k]>=modd)b[k+1]+=b[k]/modd,b[k]%=modd; } for(k=lena<<1;!b[k];k--); memcpy(a,b,(k+1)<<3);lena=k; } inline void multoc(){ register int i,j,k; memset(b,0,(lena+lenc+1)<<3); for(i=1;i<=lena;i++)for(j=1,k=i;j<=lenc;j++,k++){ b[k]+=a[i]*c[j]; if(b[k]>=modd)b[k+1]+=b[k]/modd,b[k]%=modd; } for(k=lena+lenc;!b[k];k--); memcpy(c,b,(k+1)<<3);lenc=k; } inline void poi(int b){//计算4^b c[lenc=1]=1;a[lena=1]=4; while(b){ if(b&1)multoc(); b>>=1; if(b)multoa(); } } int main(){ n=read(); f[1]=1,f[2]=2,f[3]=3; l=1,r=0; for(i=4;i<=25;i++){ while(l<r&&xl(dl[r-1],dl[r])>=xl(dl[r],i-3))r--; dl[++r]=i-3; while(l<r&&i>xl(dl[l],dl[l+1]))l++; f[i]=f[dl[l]]*(i-dl[l]-1); if(f[i-1]+1>f[i])f[i]=f[i-1]+1; // printf(" i:%d %lld\n",i,f[i]); } if(n<=25)printf("%lld\n",f );else{ int x=n%5+15; poi((n-x)/5); a[lena=1]=f[x]; multoc(); for(printf("%lld",c[lenc]),i=lenc-1;i>0;i--){ for(j=modd/10;j;j/=10)if(c[i]<j)putchar('0'); printf("%lld",c[i]); }puts("");//printf(" %d\n",lenc); } return 0; }
View Code
相关文章推荐
- 不错的开源FTP类库
- Roman to Integer
- 【操作系统原理】进程同步
- day19
- HDU1234开门人和关门人
- iOS UITextField InputAccessoryView & InputView的使用方法
- 剑指0ffer(替换空格)
- Chapter 10 tuplesn&Assignment
- 多点下载、断点续传、AFNetworking的简单使用
- 安装CocoaPods遇到的坑以及如何解决
- kmp算法大全,历史详解
- 字典树Trie
- Cocos2dx-lua -- 入门-class
- struts2在web.xml中配置详情
- R简易入门(一)
- 车速检测 motiondetect.c
- PHP编译参数
- Java并发编程:volatile关键字解析
- 多重背包
- NSLayoutConstraint-代码实现自己主动布局的函数使用方法说明