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; }