• 【2019.9.17】


    2019.9.17

    数学老师的报复

    11 班数学大佬 YXN 又在上数学课的时候把班主任 MP6 的错误当众挑出来了,MP6 再一
    次感到很难堪,于是决定报复 YXN
    MP6 对 YXN 说:给你一个函数 f(x),定义如下:
    f ( 1 ) = 1
    f ( 2 ) = 1
    f ( n ) = ( A * f ( n - 1 ) + B * f ( n - 2 ) ) mod 7。
    YXN 说这还不简单,可以秒杀!
    MP6 微微笑了笑说:n 等于 100 你算得出来,那 n 等于 2147483648 呢?
    YXN 哑口无言,决定向信息组的你求助。由于这是你唯一一次可以在数学题上秒杀 YXN,
    你决定好好把握这一次机会。

    ==一眼看过去就是Fibonacci第n项 就是系数变了

    所以base矩阵就是(egin{bmatrix}A&B\1&0end{bmatrix})

    然后就一模一样了

    #include<bits/stdc++.h>
    #define ll long long
    const int N=100+5,M=100+5,P=7,INF=1e9+7,inf=0x3f3f3f3f;
    ll A,B,n;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    struct Maxtrix{
        ll a[3][3];
        Maxtrix(){memset(a,0,sizeof(a));}
        Maxtrix operator*(const Maxtrix &b)const{
            Maxtrix res;
            for(int i=1;i<=2;++i)
            for(int j=1;j<=2;++j)
            for(int k=1;k<=2;++k)
            res.a[i][j]=(res.a[i][j]+(ll)a[i][k]*b.a[k][j])%P;
            return res;
        }
    }ans,base;
    
    void qmul(ll b){
        while(b){
            if(b&1) ans=base*ans;
            base=base*base,b>>=1;
        }
    }
    
    int main(){
         freopen("attack.in","r",stdin);
         freopen("attack.out","w",stdout);
     	 rd(A),rd(B),rd(n);
         if(n<=2) return puts("1"),0;
         base.a[1][1]=A,base.a[1][2]=B,base.a[2][1]=1;
         ans.a[1][1]=ans.a[2][1]=1;
         qmul(n-2);
         printf("%d",ans.a[1][1]);
        return 0;
    }
    

    物理老师和生物老师的战争

    描述】
    物。万物也。牛为大物。牛为物之大者。故物从牛。与半同意。天地之数起於牵
    牛。戴先生原象曰。牵牛为纪首。命曰星纪。自周而上。日月之行不起於;牵牛也。按许说
    物从牛之故。又广其义如此。故从牛。勿声。文弗切。十五部。
    总之,物理老师和生物老师因为“物”而吵了起来,物理老师认为,物理是万物之
    源,而生物老师认为生物才是万物之源。所以物理学科带头人和生物学科带头人号召了所有
    物理、生物老师,进行战斗。
    战斗开始前他们需要排队,有 n 个物理老师和 m 个生物老师站在一起排成一列,
    过安检进入打斗场。物理老师是一个神奇的物种,他们十分严谨,在开始之前就分析过:如
    果在任意某一个人往前数(包括这个人),生物老师的数量超过了物理老师,根据牛顿三大
    定律以及开普勒三大定律,这样风水是不太好的。这时候,物理老师就会引爆核弹。为了构
    建社会主义和谐社会,你决定避免这一场核战的发生。所以,请你计算不会引发核弹爆炸的
    排队方案的概率。(排队方案不同定义为当且仅当某一位老师不一样,注意不是老师所教的
    科目不一样。eg:物 A 物 B,物 B 物 A,是不同的方案)

    题目又臭又长==开始试图就来个超级无敌暴力

    然后搞完最后一题发现是卡特兰

    (C_{m+n}^{m}-C_{m+n}^{m-1})

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int N=20000+10,M=1e5+50,inf=0x3f3f3f3f;
    int n,m,a[N<<1],b[N<<1],sum,cnt,cnt2;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    double ans=0;
    /*
    		for(int i=1;i<=n+m;++i) a[i]=i;
    		for(int i=1;i<=n;++i) b[i]=1;
    		for(int i=n+1;i<=n+m;++i) b[i]=0;
    		while(next_permutation(a+1,a+n+m+1)){
    			++sum,cnt=0;int i;
    			for(i=1;i<=n+m;++i){
    				cnt+=b[a[i]]^1;
    				if(i-cnt<cnt) break;
    			}
    			if(i==n+m) ++cnt2;
    		}*/
    int main(){
    	freopen("fseq.in","r",stdin);
    	freopen("fseq.out","w",stdout);
    	int T;rd(T);
    	while(T--){
    		rd(n),rd(m);sum=1,cnt2=1;
    		if(n<m){puts("0.000000");continue;}
    		printf("%.6lf
    ",(double)((double)n-m+1)/((double)n+1));
    	}
        return 0;
    }
    

    化学竞赛的的大奖

    【问题描述】
    XYX 在 CChO(全国化学奥林匹克竞赛)比赛中获得了大奖,奖品是一张特殊的机票。
    使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才
    会有额外的费用。XYX 获得了一张地图,地图上有城市之间的飞机航班和费用。已知从
    每个城市出发能到达所有城市,两个城市之间可能有不止一个航班。一个国家内的每两
    个城市之间一定有不止一条飞行路线,而两个国家的城市之间只 有一条飞行路线。XYX
    想知道,从每个城市出发到额外费用最大的城市,以便估算出出行的费用,请你帮助他。
    当然,你不能通过乘坐多次一个航班增加额外费用, 也就是必须沿费用最少的路线飞
    行。
    【输入】
    第一行,两个整数 N,M,表示地图上有 N 个城市,M 条航线。
    接下来 M 行,每行三个整数 a,b,c,表示城市 a,b 之间有一条费用为 c 的航线。
    【输出】
    共 N 行,第 i 行为从城市 i 出发到达每个城市额外费用的最大值。

    缩点然后跑树的直径

    为啥我wa了一个点?!

    80昏
    #include
    using namespace std;
    #define ll long long
    #define Max(x,y) ((x)>(y)?(x):(y))
    #define Min(x,y) ((x)<(y)?(x):(y))
    const int N=20000+10,M=200000+50,inf=0x3f3f3f3f;
    int n,m;
    template void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    int head[N],tot=1,hd[N],tt=0;
    struct edge{int v,w,nxt;}e[M<<1],E[M<<1];
    void add(int u,int v,int w){
    	e[++tot]=(edge){v,w,head[u]},head[u]=tot;
    }
    void Add(int u,int v,int w){
    	E[++tt]=(edge){v,w,hd[u]},hd[u]=tt;
    }
    int idx=0,Bcnt=0,dfn[N],low[N],sz[N],bl[N];
    stacks;bool inst[N];
    void tarjan(int u,int fa){
        dfn[u]=low[u]=++idx;
        inst[u]=1,s.push(u);
        for(int i=head[u],v;i;i=e[i].nxt)
    	if((v=e[i].v)!=fa){
            if(!dfn[v]) tarjan(v,u),low[u]=min(low[u],low[v]);
            else if(inst[v]&&dfn[v]mxl) mxl=dis[v],rt=v;
    		dfs(v,u);
    	}
    }
    void dfs2(int u,int fa){
    	for(int i=hd[u],v;i;i=E[i].nxt)
    	if((v=E[i].v)!=fa){
    		dis2[v]=dis2[u]+E[i].w;
    		dfs2(v,u);
    	}
    }
    int main(){
    	freopen("prize.in","r",stdin);
    	freopen("prize.out","w",stdout);
    	rd(n),rd(m);
    	for(int i=1,u,v,w;i<=m;++i) rd(u),rd(v),rd(w),add(u,v,w),add(v,u,w);
    	for(int i=1;i<=n;++i)
    	if(!dfn[i]) tarjan(i,i);
    	for(int i=1,X,Y;i<=tot;i+=2)
    		if((X=bl[e[i].v])!=(Y=bl[e[i^1].v])) Add(X,Y,e[i].w),Add(Y,X,e[i].w);
    	dfs(1,0),dfs2(rt,0);
    	for(int i=1;i<=n;++i)
    	printf("%d
    ",Max(dis[bl[i]],dis2[bl[i]]));
        return 0;
    }
        

    ==100昏

    到各点中距离最远的应该是(max(dis[x][A],dis[x][B]))

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define Max(x,y) ((x)>(y)?(x):(y))
    #define Min(x,y) ((x)<(y)?(x):(y))
    const int N=20000+10,M=200000+50,inf=0x3f3f3f3f;
    int n,m;
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    int head[N],tot=1,hd[N],tt=0;
    struct edge{int v,w,nxt;}e[M<<1],E[M<<1];
    void add(int u,int v,int w){
    	e[++tot]=(edge){v,w,head[u]},head[u]=tot;
    }
    void Add(int u,int v,int w){
    	E[++tt]=(edge){v,w,hd[u]},hd[u]=tt;
    }
    
    int idx=0,Bcnt=0,dfn[N],low[N],sz[N],bl[N];
    stack<int>s;bool inst[N];
    void tarjan(int u,int fa){
        dfn[u]=low[u]=++idx;
        inst[u]=1,s.push(u);
        for(int i=head[u],v;i;i=e[i].nxt)
    	if((v=e[i].v)){
            if(!dfn[v]) tarjan(v,u),low[u]=min(low[u],low[v]);
            else if(inst[v]&&v!=fa&&dfn[v]<low[u]) low[u]=dfn[v];
        }
        if(dfn[u]==low[u]){
            int v;++Bcnt;
            do{
                v=s.top();s.pop();
                bl[v]=Bcnt,++sz[Bcnt],inst[v]=0;
            }while(u!=v);
        }
    }
    
    int dis[N],dis2[N],rt,mxl=0;
    void dfs(int u,int fa){
    	for(int i=hd[u],v;i;i=E[i].nxt)
    	if((v=E[i].v)!=fa){
    		dis[v]=dis[u]+E[i].w;
    		if(dis[v]>mxl) mxl=dis[v],rt=v;
    		dfs(v,u);
    	}
    }
    void dfs2(int u,int fa){
    	for(int i=hd[u],v;i;i=E[i].nxt)
    	if((v=E[i].v)!=fa){
    		dis2[v]=dis2[u]+E[i].w;
    		dfs2(v,u);
    	}
    }
    
    int main(){
    	freopen("T3.txt","r",stdin);
    //	freopen("prize.out","w",stdout);
    	rd(n),rd(m);
    	for(int i=1,u,v,w;i<=m;++i) rd(u),rd(v),rd(w),add(u,v,w),add(v,u,w);
    	for(int i=1;i<=n;++i)
    	if(!dfn[i]) tarjan(i,i);
    	for(int i=1,X,Y;i<=tot;i+=2)
    		if((X=bl[e[i].v])!=(Y=bl[e[i^1].v])) Add(X,Y,e[i].w),Add(Y,X,e[i].w);//
    	dfs(1,0);
    	memset(dis,0,sizeof(dis));mxl=0;
    	dfs(rt,0);
    	dfs2(rt,0);
    	for(int i=1;i<=n;++i)
    	printf("%d
    ",Max(dis[bl[i]],dis2[bl[i]]));
        return 0;
    }
    

    summary

    • 数学理论并不熟练
    • 记不太得
    • 对一些东西(树的直径)的性质的没有完全理解
  • 相关阅读:
    呵呵

    HDU 1878 欧拉回路
    HDU 3293 sort
    HDU 2714 ISBN
    神秀作偈
    大学之道
    写给自己过去疯狂的一年(2)(写在一个特别的时候)
    这几天我的生活就是这样的
    学习和研究计划
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11533921.html
Copyright © 2020-2023  润新知