牛客小白月赛23
B. 阶乘
题意:共T次询问,每次询问给定一个正整数p,求阶乘是p的倍数的最小正整数n。(T≤103,p≤109)
思路:分解质因数,map存储每个质因数的个数,将重复的质因数分配到其倍数中。
Tips:取质因数取到根号n即可,注意最后将p加入map。p可能为109规模的质数,而散列数组开不到这么大。
#include <bits/stdc++.h> using namespace std; void solve(){ int p;cin>>p; map<int,int> _map; for(int i=2;i*i<=p;i++) while(p%i==0) ++_map[i],p/=i; ++_map[p]; int ans=1; for(auto &i:_map){ int base=i.first,num=i.second; for(int j=1;num>0;j++){ int now=j*base; ans=max(ans,now); while(num>0&&now%base==0) now/=base,--num; } } cout<<ans<<"\n"; } int main() { int t;cin>>t; while(t--) solve(); return 0; }
E. A+B问题
题意:A和B都在32位有符号整数能存储的范围内,现在已知二者的和为c,问有多少种可能的输入数据。
思路:很有意思的一道题,从int的底层存储考虑,每个32bit都会对应一个和为特定值的32bit,所以答案始终是4294967296。
#include <bits/stdc++.h> using namespace std; int main() { cout<<4294967296; return 0; }
I. 寻找子串
题意:字符串的子串是指字符串中连续的一段,给定字符串s,请你找出字典序最大的子串。(|s|≤103)
思路:先找到字典序最大的字母,然后以该字母为首截取子串,取最大串即可。
#include <bits/stdc++.h> using namespace std; int main() { string s;cin>>s; char c=*max_element(s.begin(),s.end()); string ans; for(int i=0;i<s.size();i++) if(s[i]==c) ans=max(ans,s.substr(i)); cout<<ans; return 0; }
J. 最大的差
题意:给定n个数字,请你从中选出两个数字,使得这两个数字的差尽量大,输出这个最大的差。
思路:签到题。
#include <bits/stdc++.h> using namespace std; int main() { int n;cin>>n; int a[n];for(int &i:a) cin>>i; sort(a,a+n); cout<<a[n-1]-a[0]; return 0; }