B.Pow Set—约数分解
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<set>
using namespace std;
#define int long long
set<vector<pair<int,int>>>S;
int n,m;
void get_factor(int x,int y)
{
vector<pair<int,int>>pvec;
for(int i=2;i<=x/i;i++)
{
int cnt=0;
if(x%i==0)
{
while(x%i==0)x/=i,cnt++;
pvec.push_back({i,cnt*y});
}
}
if(x>1)pvec.push_back({x,y});
S.insert(pvec);
}
signed main()
{
cin>>n>>m;
for(int i=2;i<=n;i++)
for(int j=2;j<=m;j++)
get_factor(i,j);
cout<<S.size()<<endl;
}
C.Sum of Interval—公式推导
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
const int N = 200010 , mod = 1e18;
signed main()
{
int n,res=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;cin>>x;
res+=x*i*(n-i+1);
}
cout<<res<<'\n';
}
D.极差—线段树板子题
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
const int N = 50010 , mod = 1e18;
int tr_max[N*4];
int tr_min[N*4];
int a[N];
void build(int u,int l,int r)
{
if(l==r)
{
tr_max[u]=tr_min[u]=a[l];
return ;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
tr_max[u]=max(tr_max[u<<1],tr_max[u<<1|1]);
tr_min[u]=min(tr_min[u<<1],tr_min[u<<1|1]);
}
int maxv=0,minv=0;
void query(int u,int l,int r,int L,int R)
{
if(L<=l&&R>=r)
{
maxv=max(maxv,tr_max[u]);
minv=min(minv,tr_min[u]);
return ;
}
int mid=l+r>>1;
if(L<=mid)query(u<<1,l,mid,L,R);
if(R>mid)query(u<<1|1,mid+1,r,L,R);
}
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--)
{
int l,r;
cin>>l>>r;
maxv=0;
minv=1e9+7;
query(1,1,n,l,r);
cout<<maxv-minv<<'\n';
}
}