其他分享
首页 > 其他分享> > 题解 P2144 【[FJOI2007]轮状病毒】

题解 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

标签:GCC,falign,题解,P2144,long,optimize,pragma,FJOI2007,functions
来源: https://www.cnblogs.com/wenjing233/p/10395194.html