f:
这题啊,纯水题,问题就是问你所有数位之和是质数的数字中的第x个数是几,暴力就可以解决的问题,啊大海全是水
#include<bits/stdc++.h>
using namespace std;
int zhi(int x)
{
    if(x<=1)
        return 0;
	for(int i=2;i*i<=x;i++)
	if(x%i==0)
	return 0;
	return 1;
}
int f(int x)
{
	int s=0;
	while(x)
	{
		s+=x%10;
		x/=10;
	}
	return s;
}
int main()
{
	int n,k=0,a[100000]={0},i=2;
	while(k<=100000)
	{
		if(zhi(f(i))==1)
		a[k++]=i;
        i++;
	}
	cin>>n;
	cout<<a[n-1];
}
d:
给一个长度为n的内容是1-n的环,可以交换两个数字,问操作结束后能有多少环,这题就是找环的个数然后用并查集解决。
每次交换两个环的数就可以减少一个环
那么分为两种情况,一种是k>=cnt,那么花费cnt次,则剩一次
这时看剩余操作次数,若是奇数则等价于交换一次,会多出1,若是偶数则等价于交换零次,数量不变
另一种直接减k即可解决
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define debug(x) cout << Cap_suleDebug(x) << " = " << x << hh
using namespace std;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;    // 1061109567
const int MAXINT = 0x7FFFFFFF; // 2147483647
typedef pair<int, int> PII;
const int N = 2e5 + 10;
int bin[N];
int vis[N];
 
void init(int n) 
{
    for (int i = 1; i <= n; i++)
        bin[i] = i;
}
int findx(int x)
{
    int r = x;
    while (bin[r] != r)
    {
        r = bin[r];
    }
    while (bin[x] != x) 
    {
        bin[x] = r;
        x = bin[x];
    }
    return r;
}
 
  
int main()
{
    int n, k;
    cin >> n >> k;
    init(n);
    for (int i = 1; i <= n; i++)
    {
        int num;
        cin >> num;
        bin[i]=num;
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++)
    {
        int z=bin[i];
        if(!vis[z])
        {
            vis[z] = 1;
            while(z!=i)
            {
                z=bin[z];
                vis[z]=1;
            }
        }
        else cnt--;
        cnt++;
    }
    if (k >= cnt)
    {
        if ((k - cnt + 1)&1)
        {
            cnt = 2;
        }
        else
            cnt = 1;
    }
    else
        cnt = cnt - k;
    cout << cnt ;
}