传送门

题意不好描述(自己看样例解释)


首先可以推出一个递推式:fn=fn−1+2fn−2+1f_n=f_{n-1}+2f_{n-2}+1fn​=fn−1​+2fn−2​+1

然后可以构造两个等式:

  1. (fn+fn−1+1)=2(fn−1+fn−2+1)(f_n+f_{n-1}+1)=2(f_{n-1}+f_{n-2}+1)(fn​+fn−1​+1)=2(fn−1​+fn−2​+1)
  2. (fn−2fn−1−12)=−(fn−1−fn−12)(f_n-2f_{n-1}-\frac12)=-(f_{n-1}-f_n-\frac12)(fn​−2fn−1​−21​)=−(fn−1​−fn​−21​)

然后变形一波可以得到fn=⌊2n+1−13⌋f_n=\left\lfloor\frac{2^{n+1}-1}3\right\rfloorfn​=⌊32n+1−1​⌋

接着我们惊奇的发现没有模数。

只能fftfftfft加快速幂了。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long double ldb;
struct Cp{
    ldb x,y;
    friend inline Cp operator+(const Cp&a,const Cp&b){return (Cp){a.x+b.x,a.y+b.y};}
    friend inline Cp operator-(const Cp&a,const Cp&b){return (Cp){a.x-b.x,a.y-b.y};}
    friend inline Cp operator*(const Cp&a,const Cp&b){return (Cp){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
    friend inline Cp operator*(const Cp&a,const ldb&b){return (Cp){a.x*b,a.y*b};}
    friend inline Cp operator/(const Cp&a,const ldb&b){return (Cp){a.x/b,a.y/b};}
};
const ldb pi=acos(-1.0);
int lim,tim;
vector<Cp>A,B;
vector<int>pos;
inline void init(const int&up){
    lim=1,tim=0;
    while(lim<=up)lim<<=1,++tim;
    pos.resize(lim),A.resize(lim),B.resize(lim),pos[0]=0;
    for(ri i=0;i<lim;++i)pos[i]=(pos[i>>1]>>1)|((i&1)<<(tim-1));
}
inline void fft(vector<Cp>&a,const int&type){
    for(ri i=0;i<lim;++i)if(i<pos[i])swap(a[i],a[pos[i]]);
    for(ri mid=1;mid<lim;mid<<=1){
        Cp wn=(Cp){cos(pi/mid),type*sin(pi/mid)};
        for(ri j=0,len=mid<<1;j<lim;j+=len){
            Cp w=(Cp){1,0},a0,a1;
            for(ri k=0;k<mid;++k,w=w*wn){
                a0=a[j+k],a1=a[j+k+mid]*w;
                a[j+k]=a0+a1,a[j+k+mid]=a0-a1;
            }
        }
    }
    if(type==-1)for(ri i=0;i<lim;++i)a[i]=a[i]/(ldb)lim;
}
struct poly{
    vector<Cp>a;
    poly(int k=0,Cp x=(Cp){0,0}){a.resize(k+1),a[k]=x;}
    inline int deg()const{return a.size()-1;}
    inline poly extend(const int&k){poly ret=*this;return ret.a.resize(k+1),ret;}
    inline Cp&operator[](const int&k){return a[k];}
    inline const Cp&operator[](const int&k)const{return a[k];}
    friend inline poly operator*(const poly&a,const poly&b){
        int n=a.deg(),m=b.deg();
        init(n+m);
        poly ret(lim);
        for(ri i=0;i<=n;++i)A[i]=a[i];
        for(ri i=0;i<=m;++i)B[i]=b[i];
        for(ri i=n+1;i<lim;++i)A[i]=(Cp){0,0};
        for(ri i=m+1;i<lim;++i)B[i]=(Cp){0,0};
        fft(A,1),fft(B,1);
        for(ri i=0;i<lim;++i)A[i]=A[i]*B[i];
        return fft(A,-1),ret.a=A,ret;
    }
    friend inline poly operator*(const poly&a,const ldb&b){
        poly ret(a.deg());
        for(ri i=0;i<=a.deg();++i)ret[i]=a[i]*b;
        return ret;
    }
    friend inline poly operator/(const poly&a,const ldb&b){
        poly ret(a.deg());
        for(ri i=0;i<=a.deg();++i)ret[i]=a[i]/b;
        return ret;
    }
};
inline poly update(const poly&a){
    vector<int>res;
    int sum=0;
    for(ri val,i=0,up=a.deg();i<=up;++i)val=((int)(a[i].x+0.5))+sum,sum=val/10,res.push_back(val%10);
    while(sum)res.push_back(sum%10),sum/=10;
    while(!res[res.size()-1]&&res.size()!=1)res.pop_back();
    poly ret(res.size()-1);
    for(ri i=0;i<=ret.deg();++i)ret[i]=(Cp){res[i],0};
    return ret;
}
inline void ksm(int p){
    poly ret,a;
    ret[0]=(Cp){1,0},a[0]=(Cp){2,0};
    while(p){
        a=update(a);
        if(p&1)ret=update(ret),ret=ret*a;
        a=a*a,p>>=1;
    }
    ret=update(ret),reverse(ret.a.begin(),ret.a.end());
    vector<int>ans;
    for(ri val,divv=0,i=0;i<=ret.deg();++i)val=(int)ret[i].x+divv,ans.push_back(val/3),divv=val%3*10;
    int pos=0;
    while(!ans[pos]&&pos!=ans.size()-1)++pos;
    for(ri i=pos;i<ans.size();++i)cout<<ans[i];
    puts("");
}
char s[10005];
int main(){
    int n,m;
    scanf("%d",&m);
    while(m--)scanf("%d",&n),ksm(n+1);
    return 0;
}

2019.01.02 bzoj5300: [Cqoi2018]九连环(fft优化高精+快速幂)的更多相关文章

  1. BZOJ5300 [Cqoi2018]九连环 【dp + 高精】

    题目链接 BZOJ5300 题解 这题真的是很丧病,,卡高精卡到哭 我们设\(f[i]\)表示卸掉前\(i\)个环需要的步数 那么 \[f[i] = 2*f[i - 2] + f[i - 1] + 1 ...

  2. 【BZOJ5298】[CQOI2018]交错序列(动态规划,矩阵快速幂)

    [BZOJ5298][CQOI2018]交错序列(动态规划,矩阵快速幂) 题面 BZOJ 洛谷 题解 考虑由\(x\)个\(1\)和\(y\)个\(0\)组成的合法串的个数. 显然就是把\(1\)当做 ...

  3. BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】

    题目分析: 这道题是数学必修五的原题,做法如下图,书上讲得很详细了. 那么这道题目用快速幂就可以解决了,值得注意的是,分析时间复杂度会发现直接做乘法其实是O(n^2)的,但是有一个1/20左右的常数, ...

  4. # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT

    今天做了传说中的CQOI六道板子题--有了一种自己很巨的错觉(雾 题面 求n连环的最少步数,n <= 1e5. 题解 首先--我不会玩九连环-- 通过找规律(其实是百度搜索)可知,\(n\)连环 ...

  5. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  6. 快速幂 ,快速幂优化,矩形快速幂(java)

    快速幂形式 public static int f(int a,int b,int c){ int ans =1; int base=a; while(b!=0){ if((b&1)!=0) ...

  7. 2019.01.02 bzoj3513: [MUTC2013]idiots(fft)

    传送门 fftfftfft经典题. 题意简述:给定nnn个长度分别为aia_iai​的木棒,问随机选择3个木棒能够拼成三角形的概率. 思路:考虑对于木棒构造出生成函数然后可以fftfftfft出两个木 ...

  8. 2019.01.02 bzoj2467: [中山市选2010]生成树(矩阵树定理)

    传送门 矩阵树定理模板题. 题意简述:自己看题面吧太简单懒得写了 直接构建出这4n4n4n个点然后按照题面连边之后跑矩阵树即可. 代码: #include<bits/stdc++.h> # ...

  9. 2019.01.02 poj3046 Ant Counting(生成函数+dp)

    传送门 生成函数基础题. 题意:给出nnn个数以及它们的数量,求从所有数中选出i∣i∈[L,R]i|i\in[L,R]i∣i∈[L,R]个数来可能组成的集合的数量. 直接构造生成函数然后乘起来f(x) ...

随机推荐

  1. TCL脚本语言基础介绍

    Tcl简介(一):Tcl 语法 Tcl 语法 Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以释运行,其强大的功能和简单精妙的语法会使你感到由衷的喜悦,这片文章对 Tcl有很好的描述和说明.如 ...

  2. 58. Length of Last Word (String)

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  3. Fraction to Recurring Decimal(STRING-TYPE CONVERTION)

    QUESTION Given two integers representing the numerator and denominator of a fraction, return the fra ...

  4. GridView和DataFormatString 日期格式 精确小数点后位数

    如果DataFormatString无效,请添加属性 HtmlEncode = "false" --------------------------------------- Da ...

  5. swift - 全屏imageView的适配 - UIViewContentMode选择

    1. /// 设置当前图片view大小 func setFrame(){ if #available(iOS 11.0, *) { if let y = JY_WINDOW?.safeAreaInse ...

  6. ARM交叉编译工具链

    交叉编译工具链是一个由编译器.连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils.gcc和glibc三个部分组成. 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译 ...

  7. JQuery UI之Autocomplete(4)多值输入、远程缓存与组合框

    1.多值输入 首先加入相关的css和js文件,以及对应的HTML代码如下: <link href="../css/jquery-ui.css" rel="style ...

  8. phalcon安装-遇坑php-config is not installed 解决方法

    通过源码编译安装php环境,按照phalcon官方文档安装扩展,会遇到php-config is not installed的坑. 尝试通过下列命令可以解决: cd /opt/cphalcon-/bu ...

  9. PAT 1087 有多少不同的值(20)(STL-set代码)

    1087 有多少不同的值(20 分) 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x 的最大自然数 ...

  10. Cannot load JDBC driver class 'oracle.jdbc.OracleDriver'

    项目报这个错误,后来查了,是缺少ojdbc,也就是java操作oracle的包,通过https://mvnrepository.com/artifact/oracle/ojdbc/1.4,可以找到该包 ...