[bzoj3287] Mato的刷屏计划

  第一眼以为是傻逼斜率优化>_<

  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[n]=f[x]*4^((n-x)/5)..........

  我死活没看出来这是为啥。。。

  我显然是连FFT都不会的傻逼。。只好写了个压位高精度快速幂。。结果跑了#3。。233

  突然觉得正解显然不是FFT = =。。另外status里面一堆奇怪语言也是感人>_<

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define ll long long
 5 #define d double
 6 using namespace std;
 7 const int maxn=1002333;
 8 const int modd=1000000000;
 9 ll f[233];
10 int dl[maxn],l,r;
11 ll a[32333],c[32333],b[32333];
12 int i,j,k,n,m,lena,lenc;
13
14 inline d xl(int k,int j){//k<j<i-2
15     return ( f[j]*(j+1)-f[k]*(k+1) )/ (d)(f[j]-f[k]);
16 }
17 int ra,fh;char rx;
18 inline int read(){
19     rx=getchar(),ra=0,fh=1;
20     while((rx<‘0‘||rx>‘9‘)&&rx!=‘-‘)rx=getchar();
21     if(rx==‘-‘)fh=-1,rx=getchar();
22     while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
23 }
24 inline void multoa(){
25     register int i,j,k;
26     memset(b,0,(lena*2+1)<<3);
27     for(i=1;i<=lena;i++)for(j=1,k=i;j<=lena;j++,k++){
28         b[k]+=a[i]*a[j];
29         if(b[k]>=modd)b[k+1]+=b[k]/modd,b[k]%=modd;
30     }
31     for(k=lena<<1;!b[k];k--);
32     memcpy(a,b,(k+1)<<3);lena=k;
33 }
34 inline void multoc(){
35     register int i,j,k;
36     memset(b,0,(lena+lenc+1)<<3);
37     for(i=1;i<=lena;i++)for(j=1,k=i;j<=lenc;j++,k++){
38         b[k]+=a[i]*c[j];
39         if(b[k]>=modd)b[k+1]+=b[k]/modd,b[k]%=modd;
40     }
41     for(k=lena+lenc;!b[k];k--);
42     memcpy(c,b,(k+1)<<3);lenc=k;
43 }
44 inline void poi(int b){//计算4^b
45     c[lenc=1]=1;a[lena=1]=4;
46     while(b){
47         if(b&1)multoc();
48         b>>=1;
49         if(b)multoa();
50     }
51 }
52
53 int main(){
54     n=read();
55     f[1]=1,f[2]=2,f[3]=3;
56     l=1,r=0;
57     for(i=4;i<=25;i++){
58         while(l<r&&xl(dl[r-1],dl[r])>=xl(dl[r],i-3))r--;
59         dl[++r]=i-3;
60         while(l<r&&i>xl(dl[l],dl[l+1]))l++;
61         f[i]=f[dl[l]]*(i-dl[l]-1);
62         if(f[i-1]+1>f[i])f[i]=f[i-1]+1;
63 //      printf(" i:%d   %lld\n",i,f[i]);
64     }
65     if(n<=25)printf("%lld\n",f[n]);else{
66         int x=n%5+15;
67         poi((n-x)/5);
68         a[lena=1]=f[x];
69         multoc();
70         for(printf("%lld",c[lenc]),i=lenc-1;i>0;i--){
71             for(j=modd/10;j;j/=10)if(c[i]<j)putchar(‘0‘);
72             printf("%lld",c[i]);
73         }puts("");//printf("  %d\n",lenc);
74     }
75     return 0;
76 }

时间: 2024-10-16 22:38:18

[bzoj3287] Mato的刷屏计划的相关文章

bzoj 3287: Mato的刷屏计划 高精水题 &amp;&amp; bzoj AC150

3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Description Mato同学喜欢上QQ,但是有少数傻逼总是问他一些弱智问题.Mato感到很反感,想要鄙视一下他们.他决定在QQ上刷屏,也就是发出一大堆字符.Mato的键盘上有4个键:A.B.C.D.按A就会输入一个字符,按B会把所有字符选中,按C会把选中的字符放入剪贴板,按D会插入剪贴板的内容.他的

查看Oracle执行计划的几种常用方法-系列2

续上篇:http://blog.csdn.net/bisal/article/details/38919181 3. AUTOTRACE开关 SQLPLUS中打开AUTOTRACE开关可以得到SQL的执行计划. 从提示可以看到AUTOTRACE有几个选项: OFF/ON/TRACEONLY/EXPLAIN/STATISTICS. 实验: 1. 执行SET AUTOTRACE ON: 2. 执行SET AUTOTRACE TRACEONLY: 3. 执行SET AUTOTRACE TRACEONL

oracle如何查看执行计划

1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + 目标SQL select * from table(dbms_xplan.display)3. DBMS_XPLAN 包 1) select * from table(dbms_xplan.display_cursor(null,null,'advanced')) 它用于在SQLPLUS中查看刚刚

ORACLE实际执行计划与预估执行计划不一致性能优化案例

  在一台ORACLE服务器上做巡检时,使用下面SQL找出DISK_READ最高的TOP SQL分析时,分析过程中,有一条SQL语句的一些反常现象,让人觉得很奇怪: SELECT SQL_ID,        SQL_TEXT,        DISK_READS,        BUFFER_GETS,        PARSING_SCHEMA_NAME,        EXECUTIONS FROM   V$SQLAREA ORDER  BY DISK_READS DESC; 在SQL D

mysql计划任务每天定时执行

代码例子:CREATE EVENT `course_listener` ON SCHEDULE EVERY 1 DAY STARTS '2012-07-18 00:00:00' ON COMPLETION PRESERVE ENABLE DO UPDATE `om_courselist` SET `status`=6 WHERE `status`=5 AND `closetime`<CURRENT_TIMESTAMP(); 可以用navicat创建事件,更快捷: Navicat创建和设计MySQ

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

MVC与单元测试实践之健身网站(六)-计划的添加与重置

健身计划需要使用者自己定制,没有现成的内容可供选择.本篇就是关于健身计划的添加与重置功能的一部分. 一 功能描述 a) 关于计划的定制,决定以周期的方式,比如有人会以一周为周期,然后安排每周的1.3.5进行锻炼.系统将以以这种模式为典型来实现,首先需要设定一个周期循环的天数,然后为其中的某些天安排特定的锻炼内容,剩下没有安排的天数为休息时间. 为某一天安排具体的锻炼内容时,数据来自通过后台添加的训练项目,这块的功能之前已经完成.因为训练项目分成了两类,一类是对局部肌肉的锻炼,另一类是全身性的综合

六、任务计划管理cron

6.1.一次任务计划at/batch at:定时运行命令 作用:at命令再指定时刻执行指定的命令序列 用法:at [-V][-q 队列][-f file][-m] time 常用选项: -V:输出版本号 -q:选用-q参数则可选队列名称,队列名称可以是a-z和A-Z之间的字母,队列字母顺序越高,队列优先级越高. -f:从文件中读取命令或者shell脚本,而非在提示后指定他们. -m:执行完作业后发送邮件给用户 time:指定作业执行时间    绝对时间: HH:MM, DD.MM.YY MM/D

Windows 计划任务

什么是Windows 计划任务 简单来说,就是能够预先配置一个任务让电脑在指定的时间或是周期去自己主动执行. 对于一些须要反复执行的任务设置这个会比較方便. 这个任务能够是一个exe 的应用程序, 能够是一段bat 脚本文件, 也能够是一段perl 的程序, 等等 怎样设置计划任务 方式一: 開始->程序->附件->系统工具   打开"计划任务"窗体 方式二: 在执行中输入 tasks 加入方式就非常easy 1.  右键单击空白. 进行加入: 2. 起个名字.邮件单