您的位置:首页 > 其它

[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里面一堆奇怪语言也是感人>_<

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: