• Educational Codeforces Round 83 (Rated for Div. 2)


    A.Two Regular Polygons

    题解

    这个结论很好猜吧,肯定是倍数关系啦。
    要证明的话,你就在那个(n) 边形的每一条边都扣出(n/m) 个角就可以了

    #include<bits/stdc++.h>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    #define X first
    #define Y second
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    int T,n,m; 
    int main()
    {
    	T=read();
    	while(T--)
    	{	
    		n=read();m=read();
    		if(n%m==0)puts("YES");
    		else puts("NO");
    	}
    	return 0;
    }
    

    B.Bogosort

    题解

    既然是个构造,让(j-a_j≠i-a_i),那么由于第一项单增,我们只需要让(a_i) 递减排列就不可能出现相等情况了

    #include<bits/stdc++.h>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    #define X first
    #define Y second
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    const int maxn=110;
    int T,n,a[maxn],b[maxn];
    int main()
    {
    	T=read();
    	while(T--)
    	{
    		n=read();
    		for(int i=1;i<=n;i++)a[i]=read();
    		sort(a+1,a+n+1);
    		for(int i=n;i>=2;i--)printf("%d ",a[i]);
    		printf("%d
    ",a[1]);
    	}
    	return 0;
    }
    

    C.Adding Powers

    题解

    把每个数拆成(k) 进制。依题意,每一位至多是1,否则就不行。

    #include<bits/stdc++.h>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    #define X first
    #define Y second
    inline LL read()
    {
    	LL x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    int T,n,k,add[70];
    LL a;
    int main()
    {
    	T=read();
    	while(T--)
    	{
    		mem(add,0);
    		n=read();k=read();
    		bool ok=0;
    		for(int i=0;i<n;i++)
    		{
    			a=read();
    			LL tmp=a;
    			int j=0;
    			while(tmp)
    			{
    				add[j]+=(tmp%k);
    				if(add[j]>1){ok=1;break;}
    				j++;
    				tmp=tmp/k;
    			}	
    		}
    		if(!ok)puts("YES");
    		else puts("NO");
    		
    	}
    	return 0;
    }
    

    D.Count the Arrays

    题解

    结论题
    最多只能有两个数相等,所以不考虑重复的,有(n-1) 个数,从(m) 个数里选(n-1) 个,有(C^{n-1}_m) 种,然后最大的数当峰值,将剩下(n-2) 个数,分成两组一左一右,又有(2^{n-2}) 种,最后把重复的再算上,乘以一个(n-2) 就好了 ,再添加重复元素的时候需要注意,会产生多一倍的重复情况,例如((1,2|3,1)) 可以由((1,2|3)) 复制一个1以及((2|3,1)) 复制一个1获得,所以需要再除以2。
    答案为(C^{n-1}_m*(n-2)*2^{n-3})
    需要特判(n=2)的情况(我还因此炸了两次)
    考完才发现没有必要写快速幂

    #include<bits/stdc++.h>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    #define X first
    #define Y second
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    const int MOD=998244353;
    int n,m;
    LL inv[200010];
    LL C(int n,int m)
    {
    	LL res=1;
    	for(int i=1;i<=m;i++)res=(res*(LL)(n-i+1)%MOD*inv[i])%MOD;
    	return res;
    }
    LL quickpow(LL a,int N)
    {
        LL res=1;
        while(N)
        {
            if(N&1)res=(res*a)%MOD;
            a=a*a%MOD;
            N>>=1;
        }
        return res;
    } 
    int main()
    {
    	inv[1]=1;
        for(int i=2;i<=200000;i++)inv[i]=((LL)(MOD-MOD/i)*(LL)inv[MOD%i])%MOD;
    	n=read();m=read();
    	if(n==2)printf("%d
    ",0);
    	else printf("%lld
    ",C(m,n-1)*quickpow(2,n-3)%MOD*(LL)(n-2)%MOD);
    	return 0;
    }
    

    E.Array Shrinkin

    题解

    (dp[i][j]) 表示区间([i,j]) 最后能化成什么数,这个可以在(O(n^3)) 时间内解决,然后最后线段覆盖求最小值即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define mem(a,b) memset(a,b,sizeof(a))
    typedef long long LL;
    typedef pair<int,int> PII;
    #define X first
    #define Y second
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    const int maxn=510;
    int n,a[maxn],dp[maxn][maxn],vis[maxn][maxn],f[maxn];
    int DP(int L,int R)
    {
    	if(vis[L][R])return dp[L][R];
    	vis[L][R]=1;
    	int &res=dp[L][R];
    	if(R<L)return -1;
    	if(R==L)return res=a[L];
    	for(int i=L;i<R;i++)
    		if(DP(L,i)==DP(i+1,R) && DP(L,i)!=-1)return res=DP(L,i)+1;
    	return res;
    }
    int main()
    {
    	mem(dp,-1);
    	n=read();
    	for(int i=1;i<=n;i++)a[i]=read();
    	DP(1,n);
    	mem(f,42);
    	f[0]=0;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=i;j++)
    			if(dp[j][i]!=-1)f[i]=min(f[i],f[j-1]+1);
    	printf("%d
    ",f[n]);
    	return 0;
    }
    

    事后补题

    F. Attack on Red Kingdom

    题解

    一定会来的
    博弈论。。。有点害怕

    废话

  • 相关阅读:
    angular2监听页面大小变化
    angular如何引入公共JS
    angular使用Md5加密
    angular4模块中标签添加背景图
    angular使用sass的scss语法
    设置angular公共样式表
    更改angular的默认端口
    angular模拟web API
    RN与webview通讯
    shell通过ping检测整个网段IP的网络状态脚本
  • 原文地址:https://www.cnblogs.com/FYH-SSGSS/p/12452912.html
Copyright © 2020-2023  润新知