【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 ... 
随机推荐
- JavaScript对象的常用属性及使用
			什么是浏览器对象模型? 浏览器对象模型(BOM Browser Object Model)是JavaScript的组成之一,它提供了独立于内容和浏览器窗口进行交互的对象,使用浏览器对象模型可以实现与H ... 
- python学习笔记:(一)基础语法
			一.编码 默认情况下,python3采用的是utf-8,所有字符串都是unicode字符串.如果有其他需要的时候,可以修改为其他的. 如:# _*_ coding:gb2312 _*_ 二.标识符 标 ... 
- Mysql-5.7 x64安装
			首先在官网下载Mysql:https://dev.mysql.com/downloads/mysql/ 选择ZIP Archive下载. 下载安装之后配置环境变量: 编辑现有环境变量Path: PS: ... 
- 【ABAP系列】SAP ABAP 实现FTP的文件上传与下载
			公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 实现FTP的文 ... 
- Scratch少儿编程系列:(六)诗词《从军行》赏析
			一.程序说明 本程序用来显示<从军行>诗词,逐字显示.本来计划用2.0制作,但在制作过程中,在“造型”中无法输入汉字,临时采用3.0版本,1.4版本也可以. 二.程序流程图 为了更直观的描 ... 
- 【Qt开发】foreach用法
			If you just want to iterate over all the items in a container in order, you can use Qt's foreach key ... 
- python  multiprocessing模块 介绍
			一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ... 
- asp.net获取访问者ip地址的函数
			/// <summary> /// 获取IP地址 /// </summary> public static string IPAddress { get { string us ... 
- kotlin学习(8)泛型
			泛型的声明 与Java不同的是,Kotlin要求类型实参要么被显示的说明,要么能被编译器推导出来.因为Java在1.5版本才引入泛型,所以为了兼容过去的版本,可以不直接声明List类型的变量,而不说明 ... 
- String.Net “System.TypeInitializationException”类型的未经处理的异常在 Spring.NetDemo.exe 中发生
			今天编写String.Net时,遇到“System.TypeInitializationException”类型的未经处理的异常在 Spring.NetDemo.exe 中发生 原因配置文件的顺序写错 ... 
