Educational Codeforces Round 83 (Rated for Div. 2)

A m%n==0

B 排序倒数输出

C

题意:

给n,k,有长度为n的数组,由k的次方组成,原本都是0,可以选择加k的次方,或者不加,但只能加一次。

如果有重复加k的次方的存在输出NO,反之输出YES

思路:

只要比较在k进制中,数组没有重复出现k进制相同位置上的就是yes

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 998244353
const ll maxn=3e17+10;
ll a[50],b[50];
int n,m,t,vis[50];
ll k;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%lld",&n,&k);
        int sum=0;
        for(it i=0;i<n;i++){
            scanf("%lld",&a[i]);
            if(a[i]!=0){sum=1;}
        }
        if(sum==0){
             printf("YES\n");continue;
        }
        int f=1;ll z=1,xx=1;
        for(it i=1;z<maxn;i++){
            z*=k;//cout<<z<<endl;
            int shen=0;
            for(it i=0;i<n;i++){
                ll zz=a[i];
                zz%=z;
                zz/=xx;shen+=zz;
            }
            xx=z;//cout<<shen<<endl;
            if(shen>1){
                printf("NO\n");f=0;break;
            }
        }
        if(f){
            printf("YES\n");
        }
    }
    return 0;
}

 

 

D

题意:

给n,m,n代表时长度为n的数组,构造一个长度为n,值的范围1~m的数组,满足下面条件

1.数组中只能且必须出现一对相同的数字

2.先递增再递减

思路:

构造一个n-1的递增区间,从m个数取n-1个,因为比较大,需要乘法逆元。

取完n-1个数后,确定一个值是重复的,这里举个9 8的例子

1 2 3 4 5 6 7 8,确定4为重复的

1 2 3 4 5 6 7 8 7 6 5 4 3 2 1

所以123567这六个位子,可以选前面,或者选后面,所以有2^(n-3)种情况

这里的选4的情况可以有1234567这7个数字,(n-2)种情况

所以答案是C(m,n-1)*(n-2)*(2^(n-3))

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define pii pair<int,int>
#define mak(n,m) make_pair(n,m)
#define mem(a,b) memset(a,b,sizeof(a))
#define mod 998244353
const ll maxn=2e5+10;
ll n,m,t;
ll ksm(ll a,ll b)
{
    if(b<0)
        return 0;
    ll ans=1;
    while(b)
    {
        if(b&1)
            ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x=1;y=0;
        return a;
    }
    ll d=exgcd(b,a%b,x,y);
    ll tmp=x;
    x=y;
    y=tmp-a/b*y;
    return d;
}
ll inv(ll a,ll m){
    ll x,y;
    ll d=exgcd(a,m,x,y);
    if(d==1){
        return (x%m+m)%m;
    }
    return -1;
}
int main(){
    scanf("%lld%lld",&n,&m);
    ll nn=n-1;
    ll sum=0;
    ll a=1,b=1;int f=1;
    for(ll i=m;i>=m-nn+1 ;i--){
        a*=i;a%=mod;
        b*=(m-i+1);b%=mod;
    }
    sum=a*inv(b,mod)%mod;
    //cout<<a<<endl;
    ll k=(n-2)*ksm(2,n-3)%mod;//cout<<k<<endl;
    sum*=k;
    sum%=mod;
    printf("%lld\n",sum);
    return 0;
}

 

 

E

题意:

长度为n的数组,其中相邻的两个相等的值可以转换成一个值+1的数字,问数组可以最小化

3 2 2 -> 3 3 -> 4

思路:

。。。

posted @ 2020-03-10 02:10  ouluy  阅读(405)  评论(0编辑  收藏  举报