【题解】西南科技大学第十六届ACM程序设计竞赛暨绵阳市邀请赛 ABCE
A
观察到 ,因此连续9次洗2遍和洗5遍是等价的。之后模拟即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<string,int>m1;
map<int,int>m2;
string a[111],b[111];
int dp[11][14];
int main(){
ll n,m,i,j,k,t;
while(cin>>a[0]){
for(i=1;i<13;i++)cin>>a[i];
for(i=0;i<13;i++){
m1[a[i]]=i;
}
for(i=0;i<13;i++){
cin>>b[i];
m2[i]=m1[b[i]];
}
for(i=0;i<13;i++)dp[0][i]=i;
for(i=1;i<11;i++){
for(j=0;j<13;j++){
dp[i][j]=m2[dp[i-1][j]];
}
}
for(i=0;i<13;i++){
cout<<a[dp[9][i]]<<" ";
}
cout<<endl;
}
}B
n个数有n-1个数不同,那么一定存在2个数相同。因此最终答案是
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<string,int>m1;
map<int,int>m2,m3;
string a[111],b[111];
ll dp[111111];
int mod = 1e9+7;
int main(){
ll n,m,i,j,k,t;
dp[0]=1;
for(i=1;i<=1e5;i++){
dp[i]=dp[i-1]*i%mod;
}
while(cin>>n){
if(n==1)cout<<0<<endl;
else cout<<n*(n-1)/2%mod*dp[n]%mod<<endl;
}
}C
当 小于4时,显然无解。
不小于4时,可以这样构造:
若 为偶数,那么先输出2个A,然后输出
个R
若 为奇数,设
,那么先输出2个A,然后输出
个R,再输出AR
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<string,int>m1;
map<int,int>m2;
string a[111],b[111];
int dp[5][14];
int main(){
ll n,m,i,j,k,t;
while(cin>>n){
if(n<4)cout<<-1<<endl;
else{
if(n&1){
cout<<"AA";
for(i=0;i<n-3;i+=2)cout<<"R";
cout<<"AR";
}
else{
cout<<"AA";
for(i=0;i<n;i+=2)cout<<"R";
}
cout<<endl;
}
}
}E
虽然数据是1e6,但我们可以用一个桶来统计每个数是否出现过,缩小到1e5。
然后对于每个出现过的数,统计其每个素因子的最大幂次。最终的lcm就是这些素因子的幂次之积。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<string,int>m1;
map<int,int>m2;
int a[1111111];
int t[111111],mod=1e9+9;
void gao(int x){
int i;
for(i=2;i*i<=x;i++){
if(x%i==0){
int cnt=0;
while(x%i==0){
x/=i,cnt++;
}
t[i]=max(t[i],cnt);
}
}
if(x>1)t[x]=max(t[x],1);
}
int main(){
ll n,i,j,k,x;
cin>>n;
for(i=0;i<n;i++){
cin>>x;
a[x]=1;
}
for(i=1;i<=1e5;i++){
if(a[i]){
gao(i);
}
}
ll res=1;
for(i=0;i<1e5;i++){
while(t[i]--)res=res*i%mod;
}
cout<<res;
}