总结
T1 T3
考试时很快就写出了代码,没什么问题
T2
考试时很快就写出了代码,但思路不严谨,故失分
T4 T5
考试时很快就写出了部分分代码,无失分
题解
T1
利用最近学的数学方法即可
代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=2e6+5;
int a[maxn];
signed main()
{freopen("num.in","r",stdin);freopen("num.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);int mid=(1+n)>>1,sum=0;if(n&1){for(int i=mid;i<=n;i++) sum+=a[i];for(int i=1;i<=mid;i++) sum-=a[i];}else {for(int i=mid+1;i<=n;i++) sum+=a[i];for(int i=1;i<=mid;i++) sum-=a[i];}cout<<sum<<endl;return 0;
}
T2
不难发现他所抽出来某个数的倍数一定是所有数和的因数。且一定是质因数。
那么此时我们枚举每一个质因数。
由于他不是减一就是加一。所以我们会发现那些余数比较小的减更好,余数比较大的家更好。于是就按照余数给他们排个序,然后枚举分界线即可。
代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=2e5+5;
int a[maxn],b[maxn];
signed main()
{freopen("mod.in","r",stdin);freopen("mod.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n,sum=0,ans=inf;cin>>n;for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];for(int m=2;m*m<=sum;m++){if(sum%m==0){while(sum%m==0) sum/=m;for(int i=1;i<=n;i++) b[i]=a[i]%m;sort(b+1,b+1+n);int sum1=0,sum2=0;for(int i=1;i<=n;i++) sum1+=b[i];for(int i=n;i>=1;i--){if(sum1==sum2){ans=min(ans,sum1);break;}sum1-=b[i];sum2+=m-b[i];}}}if(sum>0){int m=sum;for(int i=1;i<=n;i++) b[i]=a[i]%m;sort(b+1,b+1+n);int sum1=0,sum2=0;for(int i=1;i<=n;i++) sum1+=b[i];for(int i=n;i>=1;i--){if(sum1==sum2){ans=min(ans,sum1);break;}sum1-=b[i];sum2+=m-b[i];}}cout<<ans;return 0;
}
T3
直接把所有数打出来,然后直接按照字典序排序即可。
代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=1e6+5;
string a[maxn];
signed main()
{freopen("cmp.in","r",stdin);freopen("cmp.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n,q;cin>>n>>q;for(int i=1;i<=n;i++) a[i]=to_string(i);sort(a+1,a+1+n);while(q--){int k;cin>>k;cout<<a[k]<<endl;}return 0;
}
T4
不难发觉,每一个指所拥有的系数一定是 \(C_{i+m-2}^{i-1}\),利用卢卡斯定理判奇偶性即可。
代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=2e5+5;
int a[maxn],b[maxn];
signed main()
{freopen("xor.in","r",stdin);freopen("xor.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);int n,m;cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){int x=i+m-2,y=i-1;if((x&y)==y) for(int j=i;j<=n;j++) b[j]^=a[j-i+1];}for(int i=1;i<=n;i++) cout<<b[i]<<' ';return 0;
}
T5
首先有一个观察:\(x=\frac{10^A-1}{9},y=\frac{10^B-1}{9}\)
然后我们接下来来考虑它的gcd。
有一个定理:
\[\gcd(x^n-1,x^m-1)=x^{\gcd(n,m)}-1;
\]
那么此时设:\(c=\gcd(A,B),ac=A,bc=B\)
那么答案就为。
\[\frac{10^c-1}{9}\times \frac{10^{ac}-1}{10^c-1}\times \frac{10^{bc}-1}{10^c-1}\\\\
10^{ac}-1=(10^c-1)\sum_{i=0}^{a-1}10^{ic}
\]
将最后这个式子照着计算即可。
代码
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
#define endl '\n'
using namespace std;
const int maxn=2e5+5;
int a,b,mod;
int kasumi(int a,int b)
{int ans=1;while(b){if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans;
}
int f1(int n,int c)
{if(!n) return 1;int x=f1(n/2,c);x=(x+kasumi(kasumi(10,(n>>1)),c)*(x-1+mod)%mod)%mod;if(n&1) x=(x+kasumi(kasumi(10,n),c)%mod)%mod;return x;
}
int f2(int n)
{if(!n) return 1;int x=f2(n/2);x=(x+kasumi(10,(n>>1))*(x-1+mod)%mod)%mod;if(n&1) x=(x+kasumi(10,n)%mod)%mod;return x;
}
signed main()
{freopen("e.in","r",stdin);freopen("e.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin>>a>>b>>mod;int c=__gcd(a,b);a/=c,b/=c;cout<<f1(a-1,c)*f1(b-1,c)%mod*f2(c-1)%mod;return 0;
}