补题之余闲来无事水两篇题解,今天的基础集训营依然是被吊打的一天。
首先看F题-牛牛与交换排序
这题是个思维题,因为题目给你的n个数是从1到n的,所以前后两数的差必为1,故我们找到第一个差不为1的位置,然后往后找如何交换才能使这个差为1,于是我们就可以得到我们题目要求的区间大小k了,然后就是拿这个k去交换区间,能交换成功(也就是使相邻数差为1)就输出yes.
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int e = 1000000007;
int num[110000];
int cp[110000];
signed main() {
int n;
cin >> n;
int len = 0;
for (int i = 1; i <= n; ++i) {
cin >> num[i];
}
num[0] = 0;
int st = -1;
int stp = -1;
for (int l = 1; l <= n; ++l) {
if (num[l] - num[l - 1] != 1 && st == -1) {
st = num[l - 1];
stp = l - 1;
}
if (st != -1 && num[l] - st == 1) {
len = l - stp;
}
}
if (st == -1)
{
cout << "yes"<< endl << 1 << endl;
return 0;
}
bool is_false = false;
for (int j = 1; j <= n; ++j) {
if (num[j] - num[j - 1] != 1) {
int cnt = 0;
for (int i = j + len - 1; i >= j; --i) {
cp[++cnt] = num[i];
}
cnt = 0;
for (int l = j ; l <= j + len - 1; ++l) {
num[l] = cp[++cnt];
}
if (num[j] - num[j-1] != 1)
{
is_false = true;
break;
}
}
}
if (is_false)
cout << "no" << endl;
else
{
if (len != 0)
cout << "yes"<< endl << len << endl;
}
}
I-牛牛的“质因数”
这道稍微坑了我一下,我完美的被套进了出题人的陷阱,用4e6*2e3的算法去做试图优化,可当我删完全部代码仔细再看的时候,这不就是一个搜索吗,只要找出所有的质数去dfs搜索就好了。不过要记得模一下因为2k<4e6,所以位数完全可能大于20位,超出long long范围了。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int e = 1000000007;
const int maxn = 4100000;
int prime[maxn];
bool visit[maxn];
int n;
int res =0 ;
void dfs(int mul,int pri,int s)
{
int tmp = s;
for (int i = pri; i <= prime[0]; ++i) {
s = tmp;
if (prime[i] * mul > n) {
return;
}
string ss;
int t = prime[i];
while (t)
{
ss+='0'+t%10;
t/=10;
}
reverse(ss.begin(),ss.end());
for (int j = 0; j < ss.length(); ++j) {
s = s * 10 + ss[j] - '0';
s %= e;
}
res += s;
res %= e;
// cout << s << endl;
dfs(mul*prime[i],i,s);
}
}
void Prime() {
for (int i = 2; i <= n; i++) {
if (!visit[i]) {
prime[++prime[0]] = i; //纪录素数, 这个prime[0] 相当于 cnt,用来计数
}
for (int j = 1; j <= prime[0] && i * prime[j] <= n; j++) {
visit[i * prime[j]] = 1;
if (i % prime[j] == 0) {
break;
}
}
}
}
signed main()
{
cin >> n;
Prime();
dfs(1,1,0);
cout << res << endl;
}