zoukankan      html  css  js  c++  java
  • P4461 [CQOI2018]九连环 题解?

    我好sb啊
    本文的除法都是整除((important)


    不放题面了


    打爆搜, 找规律。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 105;
    const int inf = 1000000005;
    int n, a[maxn], ans;
    map<int, bool> v;
    void dfs(int step) {
    	int s=0;
    	int sum=0;
    	for(int i=1;i<=n;++i) sum+=a[i], s|=(a[i]<<i);
    	if(!sum) {
    		ans = min(ans,step);
    		return;
    	}
    	if(v.count(s)) return;
    	v[s]=1;
    	if(a[1]) {
    		a[1]=0;
    		dfs(step+1);
    		a[1]=1;
    	}
    	if(!a[1]) {
    		a[1]=1;
    		dfs(step+1);
    		a[1]=0;
    		
    	}
    	for(int i=1;i<n;++i) if(a[i]) {
    		if(a[i+1]) {
    			a[i+1]=0;
    			dfs(step+1);
    			a[i+1]=1;
    		}
    		if(!a[i+1]) {
    			a[i+1]=1;
    			dfs(step+1);
    			a[i+1]=0;
    		}
    		break;
    	}
    }
    
    int main()
    {
    	for(n=1;n<=10;++n) {
    		v.clear();
    		for(int i=1;i<=n;++i) a[i]=1;
    		ans = inf;
    		dfs(0);
    		cout<<ans<<'
    ';
    	}
    	return 0;
    }
    

    打出的表

    1
    2
    5
    10
    21
    42
    85
    170
    341
    682
    

    递推式是

    [f[i]= egin{cases} 0, quad i=0\ 2*f[i-1]+1, quad i&1 \ 2*f[i-1], quad !(i&1) end{cases} ]

    然后就可以 (O(n)) 递推, 不过没模数,显然会炸, 能想到的解决方案就是高精, 而且在这个数据范围下似乎肯定是 (FFT) 优化高精快速幂。

    可是这个式子很哲学qwq
    化简下

    [f[i]= egin{cases} 0, quad i=0\ f[i-1]+f[i-1]+1, quad i&1 \ f[i-1]+f[i-1], quad !(i&1) end{cases} ]

    继续拆

    [egin{cases} 0, quad i=0\ 1,quad i=1\ f[i-1]+2*f[i-2]+1, quad i&1 \ f[i-1]+2*f[i-2]+1, quad !(i&1) end{cases} ]

    对于最后这个式子可以求它的封闭形式(我不会啊gan, 具体数学&高中数学 没学好qwq)


    [别人的推导! ]

    [f_n = f_{n-1} + 2*f_{n-2} + 1 ]

    [f_n + f_{n-1}= 2*f_{n-1} + 2*f_{n-2} + 1 ]

    [f_n + f_{n-1} + 1 = 2*f_{n-1} + 2*f_{n-2} + 2 ]

    [= 2*(f_{n-1} + f_{n-2} + 1) ]

    (G_n = f_n + f_{n-1} + 1), 则

    [G[n]=2^n ]

    (G) 代入 (f_n = f_{n-1} + 2*f_{n-2} + 1), 得

    [f_i = f_{n-1} + 2*f_{n-2} + 1 ]

    [= f_{n-2} + G_{n-1} ]

    [= f_{n-2} + 2^{n-1} ]

    可以看出,
    (n) 为奇数时,

    [f_n = 1 + 4 + cdots 2^{n-3} + 2^{n-1} ]

    (i) 为偶数时,

    [f_n = 2 + 8 + cdots 2^{n-3} + 2^{n-1} ]

    套下等比数列求和公式

    (n) 为奇数时,

    [f_n = 1*sum_{i=0}^{frac{n}2}4^i ]

    [=frac{4^{frac{n}2+1}-1}3 ]

    (n) 为偶数时,

    [f_n = 2*sum_{i=0}^{frac{n}2-1} 4^i ]

    [= frac{2^{n+1}-2}3 ]

    (扰动法真好用qwq)

    然后就可以上 (FFT) 快速幂做这道题了qwq。
    (当然我也是闲的没事才会干这种事情)


    我不想写高精除和高精减qwq

  • 相关阅读:
    Spring 学习十五 AOP
    Spring 学习十四 Spring security安全
    博客文格式优化
    作为一名软件测试工程师,需要具备哪些能力
    单元测试工程师需要具备的任职资格
    初识安全测试(一)
    压力测试工具JMeter入门教程
    Jmeter的优点是什么?除了轻量级,它和LoadRunner有什么本质区别
    初识Jmeter(一)
    初识Selenium(四)
  • 原文地址:https://www.cnblogs.com/tztqwq/p/12878516.html
Copyright © 2011-2022 走看看