CF1114
A.Got Any Grapes?
题目大意:
给出三种葡萄的数目
解题思路:
直接模拟即可。从要求多的开始处理,最后剩下的给要求少的;这样若一个人存在无法满足要求的情况,那么一定无解。
小代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
int x,y,z,a,b,c;
signed main()
{
scanf("%lld%lld%lld",&x,&y,&z);
scanf("%lld%lld%lld",&a,&b,&c);
a-=x;
if (a<0) { printf("NO"); return 0; }
b-=y-a;
if (b<0) { printf("NO"); return 0; }
c-=z-b;
if (c<0) { printf("NO"); return 0; }
printf("YES");
return 0;
}
B.Yet Another Array Partitioning Task
题目大意:
我们定义一个序列的“美丽度”为序列前
解题思路:
因为“原序列中前
大的数”字太多了,所以下面用“天选之数”代替
显然,最大的美丽度之和就是"原序列中前
挂分小技巧 但是,要注意除了要记录哪些数是天选之数,还要记录每个天选之数的个数;否则会出现以下情况:对于所有
再次注意到
坏代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,k;
struct node{
int x,d;
}a[N];
map <int,int> mp;
int l,sum;
int cnt=1,s[N];
bool cmp1(node x,node y) { return x.x>y.x; }
bool cmp2(node x,node y) { return x.d<y.d; }
signed main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i].x);
a[i].d=i;
}
sort(a+1,a+1+n,cmp1);
for (int i=1;i<=m*k;i++)
{
sum+=a[i].x;
mp[a[i].x]++;
}
sort(a+1,a+1+n,cmp2);
int ct=0;
for (int i=1;i<=n;i++)
{
if (mp[a[i].x]) { ct++; mp[a[i].x]--; }
if (ct>=m) { ct=0; s[++cnt]=i; }
}
printf("%lld\n",sum);
for (int i=2;i<=k;i++) printf("%lld ",s[i]);
return 0;
}
C.Trailing Loves
题目大意:
给出
解题思路:
作为一个数论知识储备基本为0的蒟蒻 一道数论黄题足以让我欲哭无泪
什么?另一道题面相同的题是蓝题?
联想到短除法的过程,能够想到对于一个数
但是考虑到给
难绷的代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,b;
struct node{
int x,num;
}p[N];
int cnt;
int ans=inf;
signed main()
{
scanf("%lld%lld",&n,&b);
for (int i=2;i*i<=b;i++)//b的质因子
{
if (b%i==0)
{
p[++cnt].x=i;
while (b%i==0) { p[cnt].num++; b/=i; }
}
}
if (b>1) p[++cnt]={b,1};
for (int i=1;i<=cnt;i++)
{
int r=1,e=0;
while (n/r>=p[i].x)
{
r*=p[i].x;
e+=n/r;
}
ans=min(ans,e/p[i].num);
}
printf("%lld",ans);
return 0;
}
D.Food Fill
题目大意:
给出长度为
解题思路:
一眼区间
设状态
和木板涂色简直一样一样的
修代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5010;
int n;
int cnt,c[N];
int f[N][N];
signed main()
{
scanf("%lld",&n);
for (int i=1,x,pre=0;i<=n;i++)
{
scanf("%lld",&x);
if (x!=pre) c[++cnt]=x;
pre=x;
}
for (int len=2;len<=cnt;len++)
{
for (int i=1;i+len-1<=cnt;i++)
{
int j=i+len-1;
if (c[i]==c[j]) f[i][j]=f[i+1][j-1]+1;
else f[i][j]=min(f[i+1][j],f[i][j-1])+1;
}
}
printf("%lld",f[1][cnt]);
return 0;
}
E.Arithmetic Progession
题目大意:
已知有一个长度为
- "? i" 询问
的值 - "> x" 询问序列中是否存在严格大于
的数
可以问不超过60个询问。
要求输出等差数列的首项与公差。
解题思路:
不会
F.Please,another Qeuries on Array?
题目大意:
给出长度为
- "MULTIPLY , l , r , x",对于
,使得 - "TOTIENT , l , r",输出
解题思路:
区修区查,一眼线段树。问题在于怎样维护
首先,欧拉函数的计算方式为
所以,要求欧拉函数,就需要维护
然后没了?
感谢fjj大佬帮忙调出来了 %%%%%%%%%%
#incIude <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int N=4e5+5;
const int MOD=1e9+7;
int n,q,a[N];
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293};
struct node{
int l,r;
int sum;
int tag1,tag2;
int p;
}tr[N*4];
int inv[310],f[100];
int qsm(int x,int y)
{
int res=1;
while (y)
{
if (y&1) res=(res*x)%MOD;
y>>=1,x=(x*x)%MOD;
}
return res;
}
void push_up(int id)
{
tr[id].sum=(tr[id<<1].sum*tr[(id<<1)+1].sum)%MOD;
tr[id].p=tr[id<<1].p|tr[(id<<1)+1].p;
}
void push_down(int id)
{
int l=id<<1,r=(id<<1)+1;
if (tr[id].tag1>1)
{
tr[l].sum=(tr[l].sum*qsm(tr[id].tag1, tr[l].r - tr[l].l+1))%MOD;
tr[r].sum=(tr[r].sum*qsm(tr[id].tag1, tr[r].r - tr[r].l+1))%MOD;
tr[l].tag1*=tr[id].tag1,tr[l].tag1%=MOD;
tr[r].tag1*=tr[id].tag1,tr[r].tag1%=MOD;
}
if (tr[id].tag2)
{
tr[l].p|=tr[id].tag2,tr[l].tag2|=tr[id].tag2;
tr[r].p|=tr[id].tag2,tr[r].tag2|=tr[id].tag2;
}
tr[id].tag1=1,tr[id].tag2=0;
}
void build(int id,int l,int r)
{
tr[id].l=l,tr[id].r=r,tr[id].tag1=1;
if (l==r)
{
tr[id].sum=a[l];
for (int i=0;i<62;i++) if (a[l]%prime[i]==0) tr[id].p|=(1ll<<i);
return ;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build((id<<1)+1,mid+1,r);
push_up(id);
}
void _update(int id,int l,int r,int x,int _p)
{
if (l<=tr[id].l&&tr[id].r<=r)
{
tr[id].sum=(tr[id].sum*qsm(x, tr[id].r - tr[id].l+1))%MOD;
tr[id].tag1*=x,tr[id].tag1%=MOD;
tr[id].tag2|=_p,tr[id].p|=_p;
return ;
}
push_down(id);
int mid=(tr[id].l+tr[id].r)>>1;
if (mid>=l) _update((id<<1),l,r,x,_p);
if (mid<r) _update((id<<1)+1,l,r,x,_p);
push_up(id);
}
pii _query(int id,int l,int r)
{
if (l<=tr[id].l&&tr[id].r<=r) return mp(tr[id].sum,tr[id].p);
pii res=mp(1,0);
push_down(id);
int mid=(tr[id].l+tr[id].r)>>1;
if (mid<r)
{
pii a=_query((id<<1)+1,l,r);
res.first=(res.first*a.first)%MOD;
res.second|=a.second;
}
if (mid>=l)
{
pii b=_query((id<<1),l,r);
res.first=(res.first*b.first)%MOD;
res.second|=b.second;
}
return res;
}
signed main()
{
scanf("%lld%lld",&n,&q);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
inv[0]=inv[1]=1;
for (int i=2;i<=300;i++) inv[i]=qsm(i, MOD-2)%MOD;
for (int i=0;i<62;i++) f[i]=inv[prime[i]]*(prime[i]-1)%MOD;
char op[10];
int l,r,x;
while (q--)
{
scanf("%s",op);
if (op[0]=='M')
{
scanf("%lld%lld%lld",&l,&r,&x);
int p=0;
for (int i=0;i<62;i++) if (x%prime[i]==0) p|=(1ll<<i);
_update(1,l,r,x,p);
}
else
{
scanf("%lld%lld",&l,&r);
pii ret=_query(1,l,r);
int res=ret.first,phi=ret.second;
for (int i=0;i<62;i++) if (phi&(1ll<<i)) res=(res*f[i])%MOD;
printf("%lld\n",res%MOD);
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】