2020蓝桥国赛

C 一个数a不可能有比sqrt(a)还大的质因子,除了它自己

质因数分解定理

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const N=1e2+7;
int n;
ll p[N];
int main(){
    cin >> n;
    for(int i=1;i<=n;++i){
        int z=i;
        for(int j=2;j<=sqrt(z);++j){  //一个数a不可能有比sqrt(a)还大的质因子,除了它自己
            while(z%j==0) p[j]++,z/=j;
        }
        if(z!=1) p[z]++;
    }
    ll ans=1;
    for(int i=2;i<=100;++i){
      if(p[i]) ans*=(p[i]+1);
    }
    cout << ans;
    return 0;
}

//结果:39001250856960000

D 权值树状数组,按值建树

递增子序列的变形
树状数组——优化后的前缀和
树状数组的每个点既有a[i]的值,也有一部分前缀和的值
所以树状数组要维护其“前缀和”的性质

#include<bits stdc++.h>
using namespace std;
#define ll long long
#define low(x) x&amp;(-x)
int const N=207;
ll tr[N];  //tr[i]表示所有本质不同的序列数之和    //a[i]表示以i为结尾,本质不同的序列数之和 
map<int,int>mp;
ll ask(int p){   //只有add向后维护了,ask求的才是前缀和
    ll res=0;
    for(;p&gt;0;p-=low(p)){  
        res+=tr[p];
    }
    return res;
}
void add(int p){
    ll w=0;
    w=ask(p-1)+1;
    w-=ask(p)-ask(p-1);   //维护差值
    for(;p&lt;=26;p+=low(p)){  //不管怎么变,向后更新维护,不能省 
        tr[p]+=w;
    }
}
int n;
char ch;
int main(){
    cin &gt;&gt; n;
    for(int i=1;i&lt;=n;++i){
        cin &gt;&gt; ch;
        add(ch-'a'+1);
    }
    cout &lt;&lt; ask(26);
    return 0;
}

//结果:3616159

H 贪心就是分析两个元素交换位置的异同

设 排序中 ab 比 ba 更优
则 a.s+a.a + a.s+a.a+a.e+b.s+b.a < b.s+b.a + b.s+b.a+b.e+a.s+a.a
化简得:a.s+a.a+a.e < b.s+b.a+b.e
cmp中不要忘了return

#include<bits stdc++.h>
using namespace std;
#define ll long long
int const N=1e3+7;
struct L{
    int st,at,et,sum;
}a[N];
int n;
bool cmp(L a,L b){
    return a.st+a.at+a.et<b.st+b.at+b.et; 要return } int main(){ cin>&gt; n;
    for(int i=1;i&lt;=n;++i){
        cin &gt;&gt; a[i].st &gt;&gt; a[i].at &gt;&gt; a[i].et;
    }
    sort(a+1,a+n+1,cmp);
    ll z=0,ans=0; 
    for(int i=1;i&lt;=n;++i){
        z+=a[i-1].et+a[i].st+a[i].at;
        ans+=z;
    }
    cout &lt;&lt; ans;
    return 0;
}

未完

全部评论

相关推荐

我就是0offer糕手:北大不乱杀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务