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;
}
posted @ 2025-10-06 19:54  Engle_Chen  阅读(16)  评论(0)    收藏  举报