題解 P2144 【[FJOI2007]輪狀病毒】
阿新 • • 發佈:2019-02-18
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]輪狀病毒】