1. 程式人生 > >題解 P2144 【[FJOI2007]輪狀病毒】

題解 P2144 【[FJOI2007]輪狀病毒】

mat 語法 label ati inter loop alias line long long

打表題竟然沒有打表程序!
打表思路:枚舉選邊,並查集維護剪枝
復雜度O(答案)(實際上多很多)

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
using namespace std;    
struct gzw
{
    long long st,ed;    
}way[1000009];
long long bcj[1000009];
long long n,m;
long long ans;
long long find(long long x)
{
    return x==bcj[x]?x:find(bcj[x]);//不使用路徑壓縮的並查集支持刪除ovo    
}
void dfs(long long now,long long cs)
{
    if(m-now+1<n-1-cs) return;//剩下的邊全選也選不到n-1條
    if(cs==n-1) {++ans;return;}//選好了
    dfs(now+1,cs);
    if(find(way[now].st)!=find(way[now].ed))
    {
        register long long tmp=bcj[find(way[now].st)];
        bcj[find(way[now].st)]=find(way[now].ed);//連接
        dfs(now+1,cs+1);
        bcj[tmp]=tmp;//因為沒有路徑壓縮,所以直接把原來的父節點的父親改為自己就行了
    }
}
int main()
{
    for(register long long i=3;i<=20;++i)
    {
        n=i+1,m=0,ans=0;//初始化
        for(long long j=1;j<=i+1;++j)
        {
            bcj[j]=j;//初始化
        }
        for(int j=1;j<i;++j)
        {
            ++m;
            way[m].st=j;
            way[m].ed=j+1;  
        }
        ++m;
        way[m].st=1;
        way[m].ed=i;
        for(int j=1;j<=i;++j)
        {
            ++m;
            way[m].st=j;
            way[m].ed=n;    
        }
        //以上為連邊
        dfs(1,0);
        cout<<ans<<" ";
    }
}

這樣的代碼跑到20還是在可以等待的時間內的(本機3分鐘左右)
最後跑出來的結果是:
16 45 121 320 841 2205 5776 15125 39601 103680 271441 710645 1860496 4870845 12752041 33385280 87403801 228826125
然後明顯的是 16 121 841 5776 都是平方(其實只有 16,121 比較明顯後兩個是根據前兩個猜的)
分別是 4,11,29,76的平方
接下來在考慮45,320,2205,15125和平方有什麽關系
由小學奧數找規律得,他們可能是一個平方數加減一個數得到的,則去找離他們最近/遠的平方數是哪些
計算器得離他們最近的平方根分別是:7,18,47,123
然後和在一起就是 4,7,11,18,29,47,76,123
然後就是很明顯的斐波那契數列了
在偶數位上要減去4
然後仔細思考發現暴int_128了
於是就寫了python 不太懂語法所以寫的十分醜碼風毒瘤

n=input()
n=int(n)
a=1
b=3
c=3
d=666
if n==1:
    print("1");
elif n==2:
    print("5");
else:
    while c<=n:
        d=a
        a=b
        b=d+b
        c=c+1
    print(b*b-4*((n+1)%2))

這麽毒瘤的碼風要是被抄題解的話應該很好找吧
如果你打完表不想做小學奧數題的話可以上這個網站OIES

題解 P2144 【[FJOI2007]輪狀病毒】