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 ;
}

京公网安备 11010502036488号