【NOIP2016提高组A组7.16】第三条跑道
题目
数据范围
分析
时限5000ms。
我们注意到\(a_{i}初始值以及x小于等于600且非零\)
也就是说,\(a_{i}\)的质因数一定小于600,而600以内的质因数只有109个。
那么考虑常用于区间修改的线段树。
用线段树来维护某个位置的某个质因数的总乘积,以及某个质因数出现的位置的个数。
时间复杂度\(O(QlogN·109)\)
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
const long long mo=100000007;
const long long N=50005;
using namespace std;
struct ddx
{
long long a[120],v[120],lazy[120],sum[120];
}tree[50005];
long long ss[80000],n,m,ny[1000005],belong[1000005];
long long ans,re[10005];
bool b[1000005];
long long mi(long long x,long long y)
{
long long sum=1;
while(y)
{
if(y&1) sum=x*sum%mo;
x=x*x%mo;
y/=2;
}
return sum;
}
long long put(long long v,long long l,long long r,long long x,long long y,long long z)
{
if(l==r)
{
tree[v].a[y]=z;
tree[v].v[y]=tree[v].v[y]*mi(ss[y],z)%mo;
tree[v].sum[y]=1;
return 0;
}
long long mid=(l+r)/2;
if(x<=mid)
put(v*2,l,mid,x,y,z);
else put(v*2+1,mid+1,r,x,y,z);
for(long long i=1;i<=109;i++)
{
tree[v].a[i]=(tree[v*2].a[i]+tree[v*2+1].a[i])%mo;
tree[v].v[i]=tree[v*2].v[i]*tree[v*2+1].v[i]%mo;
tree[v].sum[i]=tree[v*2].sum[i]+tree[v*2+1].sum[i];
}
}
long long down(long long v,long long mid,long long l,long long r,long long y)
{
if(!tree[v].lazy[y]) return 0;
long long z=tree[v].lazy[y];
tree[v*2].a[y]+=z*(mid-l+1);
tree[v*2+1].a[y]+=z*(r-mid);
tree[v*2].v[y]=tree[v*2].v[y]*mi(ss[y],z*(mid-l+1))%mo;
tree[v*2+1].v[y]=tree[v*2+1].v[y]*mi(ss[y],z*(r-mid))%mo;
tree[v*2].lazy[y]+=z;
tree[v*2+1].lazy[y]+=z;
tree[v*2].sum[y]=(mid-l+1);
tree[v*2+1].sum[y]=(r-mid);
tree[v].lazy[y]=0;
}
long long change(long long v,long long l,long long r,long long x,long long x1,long long y,long long z)
{
if(l==x && r==x1)
{
tree[v].a[y]=(tree[v].a[y]+z*(r-l+1))%mo;
tree[v].v[y]=tree[v].v[y]*mi(ss[y],z*(r-l+1))%mo;
tree[v].sum[y]=(r-l+1);
tree[v].lazy[y]+=z;
return 0;
}
long long mid=(l+r)/2;
for(long long i=1;i<=109;i++) down(v,mid,l,r,i);
if(x1<=mid)
change(v*2,l,mid,x,x1,y,z);
else
if(x>mid)
change(v*2+1,mid+1,r,x,x1,y,z);
else
change(v*2,l,mid,x,mid,y,z),change(v*2+1,mid+1,r,mid+1,x1,y,z);
for(long long i=1;i<=109;i++)
{
tree[v].a[i]=(tree[v*2].a[i]+tree[v*2+1].a[i])%mo;
tree[v].v[i]=tree[v*2].v[i]*tree[v*2+1].v[i]%mo;
tree[v].sum[i]=tree[v*2].sum[i]+tree[v*2+1].sum[i];
}
}
long long find(long long v,long long l,long long r,long long x,long long x1)
{
if(l==x && r==x1)
{
for(long long i=1;i<=109;i++)
{
if(tree[v].sum[i])
ans=ans*tree[v].v[i]%mo*mi(ny[ss[i]],tree[v].sum[i])%mo*mi(ss[i]-1,tree[v].sum[i])%mo;
}
return 0;
}
long long mid=(l+r)/2;
for(long long i=1;i<=109;i++) down(v,mid,l,r,i);
if(x1<=mid)
find(v*2,l,mid,x,x1);
else
if(x>mid)
find(v*2+1,mid+1,r,x,x1);
else
find(v*2,l,mid,x,mid),find(v*2+1,mid+1,r,mid+1,x1);
for(long long i=1;i<=109;i++)
{
tree[v].a[i]=(tree[v*2].a[i]+tree[v*2+1].a[i])%mo;
tree[v].v[i]=tree[v*2].v[i]*tree[v*2+1].v[i]%mo;
tree[v].sum[i]=tree[v*2].sum[i]+tree[v*2+1].sum[i];
}
}
int main()
{
memset(b,true,sizeof(b));
b[0]=0;
b[1]=0;
for(long long i=2;i<=10000;i++)
{
if(b[i])
{
ss[++ss[0]]=i;
ny[i]=mi(i,mo-2);
belong[i]=ss[0];
}
for(long long j=1;j<=ss[0];j++)
{
if(i*ss[j]<=10000)
b[i*ss[j]]=false;
else break;
if(!(i%ss[j])) break;
}
}
scanf("%lld",&n);
for(long long i=1;i<=50001;i++)
for(long long j=1;j<=110;j++)
tree[i].v[j]=1;
for(long long j=1;j<=n;j++)
{
scanf("%lld",&re[j]);
long long p=re[j];
if(b[p])
{
put(1,1,n,j,belong[p],1);
}
else
{
for(long long k=1;ss[k]<=sqrt(re[j]) && p>1;k++)
{
long long w=0;
while(!(p%ss[k]))
{
p/=ss[k];
w++;
}
if(w)
{
put(1,1,n,j,k,w);
}
}
if(p>1)
{
put(1,1,n,j,belong[p],1);
}
}
}
long long q;
scanf("%lld",&q);
for(long long i=1;i<=q;i++)
{
long long t,x,y,z;
scanf("%lld%lld%lld",&t,&x,&y);
if(t)
{
ans=1;
find(1,1,n,x,y);
printf("%lld\n",ans);
}
else
{
scanf("%lld",&z);
long long p=z;
if(b[p])
{
change(1,1,n,x,y,belong[p],1);
}
else
{
for(long long k=1;ss[k]<=sqrt(z) && p>1;k++)
{
long long w=0;
while(!(p%ss[k]))
{
p/=ss[k];
w++;
}
if(w)
{
change(1,1,n,x,y,k,w);
}
}
if(p>1)
{
change(1,1,n,x,y,belong[p],1);
}
}
}
}
}
【NOIP2016提高组A组7.16】第三条跑道的更多相关文章
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- 5820. 【NOIP提高A组模拟2018.8.16】 非法输入(模拟,字符串)
5820. [NOIP提高A组模拟2018.8.16] 非法输入 (File IO): input:aplusb.in output:aplusb.out Time Limits: 1000 ms ...
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- 【题解】NOIP2016提高组 复赛
[题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...
- 【题解】NOIP2016 提高组 简要题解
[题解]NOIP2016 提高组 简要题解 玩具迷题(送分) 用异或实现 //@winlere #include<iostream> #include<cstdio> #inc ...
- iOS之UITableView组头组尾视图/标题悬停
最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...
- iOS自定义组与组之间的距离以及视图
iOS自定义组与组之间的距离以及视图 //头视图高度 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(N ...
随机推荐
- CentOS7 修改网卡名称为eth0 & 在VMWare中添加多网卡配置
目录 目录 前言 在CentOS 7 中为什么这样命名网卡 在RHEL7中使用RHEL6的网卡命名规则 在VMWare中为CentOS7添加网卡设备 前言 无论是RHEL 7.还是CentOS 7都使 ...
- JS单引号嵌套的问题,怎么改才能对呢!
JS单引号嵌套的问题,怎么改才能对呢! https://zhidao.baidu.com/question/416584343.html document.getElementById(celbid) ...
- oracle-只读数据文件的备份与恢复
11 只读数据文件的备份与恢复 只读数据文件是只读表空间的数据文件,数据块包括文件头在内部允许更改 SQL> alter tablespace yhqt read only; SQL> a ...
- 操作系统汇编语言之AT&T指令
转载时格式有问题,大家看原版吧! 作者:EwenWanW 来源:CSDN 原文:https://blog.csdn.net/xiaoxiaowenqiang/article/details/805 ...
- LeetCode.867-转置矩阵(Transpose Matrix)
这是悦乐书的第332次更新,第356篇原创 01看题和准备 今天介绍的是LeetCode算法题中Easy级别的第202题(顺位题号是867).给定矩阵A,返回A的转置. 矩阵的转置是在其主对角线上翻转 ...
- Lesson 2 Thirteen equals one
vicar 牧师 grocer 杂货铺店主 with a start 由于受到惊吓 Whtaever are you dong up here?你究竟在这上面干什么?whatever用于疑问句中,用以 ...
- tensorflow学习之搭建最简单的神经网络
这几天在B站看莫烦的视频,学习一波,给出视频地址:https://www.bilibili.com/video/av16001891/?p=22 先放出代码 #####搭建神经网络测试 def add ...
- 【Linux开发】计算机底层是如何访问显卡的?
1. 显卡驱动是怎么控制显卡的, 就是说, 使用那些指令控制显卡, 通过端口么? 2. DirectX 或 OpenGL 或 CUDA 或 OpenCL 怎么找到显卡驱动, 显卡驱动是不是要为他们提供 ...
- 【linux开发】apt源设置
不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp /etc/apt/sources.l ...
- python+selenium操作cookie
WebDriver提供了操作Cookie的相关方法,可以读取.添加和删除cookie信息. WebDriver操作cookie的方法: get_cookies(): 获得所有cookie信息. get ...