牛客小白月赛23

牛客小白月赛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;
}
View Code

E. A+B问题

题意:A和B都在32位有符号整数能存储的范围内,现在已知二者的和为c,问有多少种可能的输入数据。

思路:很有意思的一道题,从int的底层存储考虑,每个32bit都会对应一个和为特定值的32bit,所以答案始终是4294967296。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    cout<<4294967296;
    return 0;
}
View Code

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

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

猜你喜欢

转载自www.cnblogs.com/Kanoon/p/12543390.html