题解 P2144 [FJOI2007]轮状病毒
Posted wenjing233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P2144 [FJOI2007]轮状病毒相关的知识,希望对你有一定的参考价值。
打表题竟然没有打表程序!
打表思路:枚举选边,并查集维护剪枝
复杂度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]轮状病毒的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P2144 BZOJ 1003 [FJOI2007]轮状病毒
luogu P2144 [FJOI2007] 轮状病毒 矩阵(da)生成树(biao)+高精
[bzoj1002][FJOI2007]轮状病毒-题解[基尔霍夫矩阵][高精度][递推]