2020.11.01天梯赛练习
题目:连续因子
思路:
这题就是问 n 存在的最长连续因子,当这个 n 为素数时,那答案长度肯定为1,就是它本身;另外的情况,可以通过遍历寻找不断更新最长的连续素数情况。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> using namespace std; const long long N = 1e10 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int main(){ ll n; ll f,sum = 0; cin >> n; for(ll i = 2;i * i <= n;i++){ if(n % i != 0){ continue; } ll maxl = 0,j = i,tempn = n; while(tempn % j == 0){ tempn /= j; maxl++; j++; } if(sum < maxl){ sum = maxl; f = i; } } if(sum == 0){ cout << 1 << endl << n << endl; } else{ cout << sum << endl; for(int i = 0;i < sum;i++){ if(i == 0){ cout << f+i; } else cout << "*" << f+i; } cout << endl; } return 0; }
题目:功夫传人
思路:
这道题梳理完题意后,你便会想到用递归的方法来处理比较容易,从祖师爷往下的后辈分进行遍历,每次分情况进行削减或翻倍,将每个人的徒弟存进一个数组,再用一个数组记录得道者的倍率,在递归中找到所有得道者的功力,将最后的求和输出即可。
解题代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> #include <map> #include <set> #include <vector> using namespace std; const long long N = 1e10 + 7; const int maxn = 1e5 + 4; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) vector<int> child[100100]; int expand[100100]; double sum, z,r; void dfs(int f, double v){ if(expand[f]){ sum += v*expand[f]; } else{ for(int i = 0;i < child[f].size();i++){ dfs(child[f][i],r*v); } } } int main(){ int n; cin >> n >> z >> r; r = (100-r)/100; for(int i = 0;i < n;i++){ int x; cin >> x; if(x == 0){ cin >> expand[i]; } else{ for(int j = 0;j < x;j++){ int m; cin >> m; child[i].push_back(m); } } } dfs(0,z); printf("%d\n",(int)sum); return 0; }