zoukankan      html  css  js  c++  java
  • NOIP 模拟 $26; m 幻魔皇$

    题解 (by;zjvarphi)

    观察可发现一个点向它的子树走能到的白点,黑点数是一个斐波那契数列。

    对于白色点对,可以分成两种情况:

    1. 两个白点的 (lca) 是其中一个白点

    2. 两个白点的 (lca) 是一个黑点

    注意,两个白点的 (lca) 不可能是非两个白点之中的白点。

    分开计算即可

    Code:
    #include<bits/stdc++.h>
    #define ri register signed
    #define p(i) ++i 
    using namespace std;
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
        template<typename T>inline void read(T &x) {
            ri f=1;x=0;register char ch=gc();
            while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
            while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
            x=f?x:-x;
        } 
        template<typename T>inline void print(T x,char t) {
            if (x<0) putchar('-'),x=-x;
            if (!x) return putchar('0'),(void)putchar(t);     
            ri cnt(0);
            while(x) OPUT[p(cnt)]=x%10,x/=10;
            for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
            return (void)putchar(t);   
        }
    }
    using IO::read;using IO::print;
    namespace nanfeng{
        #define FI FILE *IN
        #define FO FILE *OUT
        template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
        template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
        typedef long long ll;
        static const int N=5e3+7,MOD=123456789;
        int h[N],f[N],g[N],n; 
        ll ans;
        template<typename T>inline void MD(T &x) {x=x>=MOD?x-MOD:x;}
        inline int main() {
            //FI=freopen("nanfeng.in","r",stdin);
            //FO=freopen("nanfeng.out","w",stdout);
            read(n);
            f[0]=g[1]=h[1]=1;
            for (ri i(2);i<=n;p(i)) {
                f[i]=f[i-1]+f[i-2],MD(f[i]);
                g[i]=g[i-1]+g[i-2],MD(g[i]);
                h[i]=h[i-1]+g[i],MD(h[i]);
            }
            int l(n<<1);--n;
            for (ri i(1);i<=l;p(i)) {
                register ll tmp(0);
                for (ri j(0);j<=n-i;p(j)) tmp+=f[j],MD(tmp);
                ans=tmp*f[i]%MOD;
                ri p=cmin(i,n),q=cmax(i-n,1);
                for (ri j(q);j<p;p(j)) 
                    ans=(ans+(ll)f[j]*f[i-j-1]%MOD*h[cmin(n-j,n-i+j)]%MOD),MD(ans);
                print(ans,' ');
            }
            return 0;
        }
    }
    int main() {return nanfeng::main();}
    
  • 相关阅读:
    Channel使用技巧
    Flask开发技巧之异常处理
    后端开发使用pycharm的技巧
    python单元测试
    Docker入门介绍
    python高阶函数的使用
    python内置模块collections介绍
    python中@property装饰器的使用
    三次握手四次挥手
    python类方法@classmethod与@staticmethod
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15085899.html
Copyright © 2011-2022 走看看