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
思路:
。。。