T1T1

考试错误:无。

思路:暴力枚举。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+50;
int a[N];
signed main(){
	freopen("mod.in","r",stdin);
	freopen("mod.out","w",stdout);
	int n,l,r;
	cin >> n >> l >> r;
	for(int i=1;i<=n;i++){
		cin >> a[i];
	}
	int mn=0xffffffff,mni=0;
	for(int i=l;i<=r;i++){
		int sum=0;
		for(int j=1;j<=n;j++){
			sum+=a[j]%i;
		}
		if(sum<mn) mni=i,mn=sum;
	}
	cout << mni;
}

T2T2

考试错误:考试时思路是对的,但是写因数分解的时候本来只要求 2255 的个数,我却写成了 11nn ( qwq\operatorname{q}w\operatorname{q} ),后来改成 1155 就对了 ( qwq\operatorname{q}w\operatorname{q} ) × 2\times\ 2

思路: 质因数分解找出有多少个 2255,再分别补齐到 kk 个。把需要补齐的 2255 相乘起来即可。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> divide25(int n){
	pair<int,int> cnt25=make_pair(0,0);
	for(int i=2;i<=5;i++){
		while(n%i==0){
			n/=i;
			if(i==2) cnt25.first++;
			if(i==5) cnt25.second++;
		}
	}
	return cnt25;
}
signed main(){
    freopen("mul.in","r",stdin);
    freopen("mul.out","w",stdout);
	int t;
	cin >> t;
	while(t--){
		int n,k;
		cin >> n >> k;
		int ans=1;
		pair<int,int> _25=divide25(n);
		if(zero>=k){
			cout << 1 << endl;
			continue;
		}
		for(int i=1;i<=k-_25.second;i++){
			ans*=5;
		}
		for(int i=1;i<=k-_25.first;i++){
			ans*=2;
		}
		cout << ans << endl;
	}
}

T4T4

考试错误:暴力骗了 1010 分。

思路:

这题的思路不太好讲,我们先来用 n=8n=8 模拟一下:

11. 字典序最小的数组是:1 2 3 4 5 6 7 8

22. 接下来我们算一下需要的逆序对总数:8*(8-1)/4=14

33. 我们发现,1122 能够贡献出 1313 个顺序对,所以只要将后面的数都倒过来,我们就得到了 1313 个逆序对,那还有 11 个怎么办呢?我们可以把 77 挪到前面,这样就有 1414 个逆序对了!

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
    freopen("gz.in","r",stdin);
    freopen("gz.out","w",stdout);
    int n;
    cin >> n;
    int zxd=n*(n-1)/4,x=n;
    while(zxd>=x){
        zxd-=--x;
        cout << n-x << " ";
    }
    zxd-=n;
    zxd=abs(zxd);
    cout << zxd << " ";
    for(int i=n;i>=n-x+1;i--){
        if(i!=zxd) cout << i << " ";
    }
}