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