2025 --【J+S 二十连测】-- 第十三套 总结
总结
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;
}
本文来自博客园,作者:Engle_Chen,欢迎转载,转载请注明原文链接:https://www.cnblogs.com/EagleChenzhilong/p/19127860
,感谢阅读!
浙公网安备 33010602011771号