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;
}
//结果:39001250856960000D 权值树状数组,按值建树
递增子序列的变形
树状数组——优化后的前缀和
树状数组的每个点既有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;
}
//结果:3616159H 贪心就是分析两个元素交换位置的异同
设 排序中 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;
}未完
