赛中只过掉了A,B题让卡时间了,真的难受
A题,对答案有贡献的字符串就是abcd....k(第k个字母),想要在长度为n的字符串找到所有的子序列,至少要让前k个字母每个出现n次,即abcd....k(第k个字母)重复n遍,便是最终答案
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int a,b;
scanf("%d%d",&a,&b);
while(a--)
{
for(int i=0;i<b;i++)
{
char s=(i+'a');
cout<<s;
}
}
cout<<endl;
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}
B.
假设a1,a2,a3.....an的gcd为g
即可以得到
因为k1,k2,k3.....kn都是大于1的正整数,所以它们的和就要大于n
即答案为求x的因数里面,满足g*n<=x的最大的那个g
坑点:最开始的时候我是直接枚举的1-x/n之间的数,即时间复杂度为o(x)在本题里面t个测试案例正好TLE了,所以这题应该把n的前枚举i,这样n/i得到另一个因数
//正确代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int x,k;
scanf("%d%d",&x,&k);
int m=x/k;
int ans=0;
for(int i=1;i*i<=x;i++)
{
int sz=i,sz1=x/i;
if(x%i==0)
{
if(sz<=m) ans=max(ans,sz);
if(sz1<=m) ans=max(ans,sz1);
}
}
cout<<ans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}
C题基于A题的思想,贪心找反例就行
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
string s,ans="";
cin>>s;
bool find[k];
memset(find, false, sizeof(find));//前k个字符是否出现过
int cnt=0;//出现字符的数量
/*贪心做法 例如abbaac 遍历到c时发现对整个字符串的贡献是abc*/
for(auto x:s)
{
if(ans.size()==n) break;
if(find[x-'a']==false) {
cnt++;
find[x-'a']=true;
}
if(cnt==k) {
ans+=x;
cnt=0;
memset(find,false,sizeof(find));
}
}
if(ans.size()==n) cout<<"YES"<<endl;
else {
cout<<"NO"<<endl;
int x=0;
for(int i=0;i<k;i++){
if(find[i]==false) {
x=i;
break;
}
}
while(ans.size()<n){
ans+=('a'+x);
}
cout<<ans<<endl;
}
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}
D题其实就是概率+二项分布,但是代码比较恶心,贴题解代码供参考
#include <bits/stdc++.h>
#define int long long
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL);
#define mod 1000000007ll
using namespace std;
const long long N=200005, INF=2000000000000000000;
int power(int a, int b, int p)
{
if(b==0)
return 1;
if(a==0)
return 0;
int res=1;
a%=p;
while(b>0)
{
if(b&1)
res=(1ll*res*a)%p;
b>>=1;
a=(1ll*a*a)%p;
}
return res;
}
int fact[N],inv[N];
void pre()
{
fact[0]=1;
inv[0]=1;
for(int i=1;i<N;i++)
fact[i]=(i*fact[i-1])%mod;
for(int i=1;i<N;i++)
inv[i]=power(fact[i], mod-2, mod);
}
int nCr(int n, int r, int p)
{
if(r>n || r<0)
return 0;
if(n==r)
return 1;
if (r==0)
return 1;
return (((fact[n]*inv[r]) % p )*inv[n-r])%p;
}
int32_t main()
{
IOS;
pre();
int t;
cin>>t;
while(t--)
{
int n, m, k;
cin>>n>>m>>k;
int sum=0;
for(int i=0;i<m;i++)
{
int a, b, f;
cin>>a>>b>>f;
sum=(sum + f)%mod;
}
int den=((n*(n-1))/2ll)%mod;
int den_inv=power(den, mod-2, mod);
int base=(((sum*k)%mod)*den_inv)%mod;
int ans=0;
for(int i=1;i<=k;i++)
{
int sum=((i*(i-1))/2ll)%mod;
int p = (nCr(k, i, mod)*power(den_inv, i, mod))%mod;
int z = ((den-1)*den_inv)%mod;
p=(p * power(z, k-i, mod))%mod;
ans = (ans + (sum*p)%mod)%mod;
}
ans = (base + (m*ans)%mod)%mod;
cout<<ans<<'\n';
}
}