Codeforces Round #447(Div. 2)
A题:签到题,问你一个字符串中存在多少QAQ,数据量不大,暴力就可以。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
cin>>str;
int len=str.size();
int ans=0;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
for(int k=j+1;k<len;k++){
if(str[i]=='Q'&&str[j]=='A'&&str[k]=='Q')ans++;
}
}
}
cout << ans<< endl;
return 0;
}
B题:给你n,m,k。题意是,给你一个n×m的矩阵,让你怎样构造矩阵,使得这个矩阵的每一行每一列的乘积都为k。
首先是不合法的情况,当n和m相加为奇数的时候,并且k为-1,这个举点例子就可以推出来。
然后是合法的情况,对于一个n×m的矩阵,我们可以随意安排(n-1)×(m-1)内矩阵的点,最后的时候,用最后一行和最后一列调一下就肯定能调出来正确结果。所以最终的答案是:2的(n-1)方的(m-1)次方。
AC代码:
#include<bits/stdc++.h>
#include<string>
#include<cstring>
#include<stdio.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn =1000;
# define mod 1000000007
ll quickpow(ll t1,ll t2){
if(t2==0)return 1;
t2--;
ll ans=t1;
while(t2){
if(t2&1)ans=ans*t1%mod;
t1=t1*t1%mod;
t2>>=1;
}
return ans;
}
int main(){
ll n,m,k;
cin>>n>>m>>k;
if((n+m)%2!=0&&k==-1){
cout<<0<<endl;
}
else cout<<quickpow(quickpow(2,n-1),m-1)<<endl;
return 0;
}
C题:给你n和n个数,问你在需要多少个数的前提下,能够出现上述数的任意个相邻数的gcd,如果无法构成就输出-1
。
首先判断非法情况,就是在给定的数里面,有的数构成的gcd并没有在数列中出现,这种肯定是不合法的。然后对于合法的,我们可以找到一个数列中的最小的数,然后每一个数的后面都插上这个最小的数,这样的话,对于数列中本来的数,可以让i和j相等的时候得到,然后对于下面的,直接用最小的数给卡住了,然后照样输出就可以了。
AC代码:
#include<bits/stdc++.h>
#include<string>
#include<cstring>
#include<stdio.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn =1000000+100;
# define mod 1000000007
int a[maxn];
int ans[maxn];
map<int,int>vis;
int main()
{
int n;
cin>>n;
int minn=inf;
for(int i=1; i<=n; i++)
{
cin>>a[i];
vis[a[i]]=1;
minn=min(minn,a[i]);
}
int flag=1;
for(int i=1; i<=n; i++)
{
int temp=a[i];
for(int j=1; j<=i; j++)
{
temp=__gcd(temp,a[j]);
if(vis[temp]==0)flag=0;
}
}
if(flag==0)cout<<-1<<endl;
else
{
cout<<n*2<<endl;
for(int i=1; i<=n; i++)
{
cout<<a[i]<<" "<<minn<<" ";
}
cout<<endl;
}
return 0;
}