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&(-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>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<=26;p+=low(p)){ //不管怎么变,向后更新维护,不能省 tr[p]+=w; } } int n; char ch; int main(){ cin >> n; for(int i=1;i<=n;++i){ cin >> ch; add(ch-'a'+1); } cout << 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>> n; for(int i=1;i<=n;++i){ cin >> a[i].st >> a[i].at >> a[i].et; } sort(a+1,a+n+1,cmp); ll z=0,ans=0; for(int i=1;i<=n;++i){ z+=a[i-1].et+a[i].st+a[i].at; ans+=z; } cout << ans; return 0; }
未完