Rikka with Phi

 Accepts: 5
 Submissions: 66
 Time Limit: 16000/8000 MS (Java/Others)
 Memory Limit: 131072/131072 K (Java/Others)
Problem Description

Rikka and Yuta are interested in Phi function (which is known as Euler's totient function).

Yuta gives Rikka an array A[1..n]A[1..n] of positive integers, then Yuta makes mm queries.

There are three types of queries:

1 \; l \; r1lr

Change A[i]A[i] into \varphi(A[i])φ(A[i]), for all i \in [l, r]i∈[l,r].

2 \; l \; r \; x2lrx

Change A[i]A[i] into xx, for all i \in [l, r]i∈[l,r].

3 \; l \; r3lr

Sum up A[i]A[i], for all i \in [l, r]i∈[l,r].

Help Rikka by computing the results of queries of type 3.

Input

The first line contains a number T(T \leq 100)T(T≤100) ——The number of the testcases. And there are no more than 2 testcases with n > 10 ^ 5n>10​5​​

For each testcase, the first line contains two numbers n,m(n \leq 3 \times 10^5, m \leq 3 \times 10^5)n,m(n≤3×10​5​​,m≤3×10​5​​)。

The second line contains nn numbers A[i]A[i]

Each of the next mm lines contains the description of the query.

It is guaranteed that 1 \leq A[i] \leq 10^71≤A[i]≤10​7​​ At any moment.

Output

For each query of type 3, print one number which represents the answer.

Sample Input
1
10 10
56 90 33 70 91 69 41 22 77 45
1 3 9
1 1 10
3 3 8
2 5 6 74
1 1 8
3 1 9
1 2 10
1 4 9
2 8 8 69
3 3 9
Sample Output
80
122
86
/*
BestCoder Round #73 (div.1)
hdu5634 Rikka with Phi
本来最开始用伸展树(主要是线段树不是很熟)的,但是中间有点问题,导致一直是TLE,于是乎
就去写线段树了
感觉对线段树的理解上有很多问题TAT
思路:先打个表然后用线段树(平衡树)去解决
主要是有same标记,sum和,欧拉
中间在将一个区间改变成欧拉时,如果中间遇到了区间的same,直接
修改这个标记就好的
hhh-2016-02-25 17:54:59
*/ #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
using namespace std;
typedef long long ll;
typedef long double ld; const int maxn = 300010;
ll euler[10000010] = {0};
void getEuler()
{
euler[1] = 1;
for(ll i =2 ; i <= 10000000; i++)
{
if(!euler[i])
{
for(ll j = i; j <= 10000000; j += i)
{
if(!euler[j])
euler[j] = j;
euler[j] = euler[j]/i*(i-1);
}
}
}
} struct node
{
int l,r;
ll sum,same;
} segtree[maxn<<2]; void push_up(int r)
{
int lson = r<<1,rson = (r<<1)|1;
segtree[r].sum = segtree[lson].sum + segtree[rson].sum;
if(segtree[lson].same == segtree[rson].same)
segtree[r].same = segtree[lson].same;
else
segtree[r].same = 0;
} void build(int i ,int l,int r)
{
segtree[i].l = l,segtree[i].r = r;
segtree[i].sum = segtree[i].same = 0;
if(l == r)
{
scanf("%I64d",&segtree[i].same);
segtree[i].sum = segtree[i].same;
return ;
}
int mid = (l+r)>>1;
build(i<<1,l,mid);
build((i<<1)|1,mid+1,r);
push_up(i);
} void push_down(int r)
{
int lson = r<<1,rson = (r<<1)|1;
if(segtree[r].same)
{
segtree[lson].same = segtree[r].same;
segtree[rson].same = segtree[r].same;
segtree[lson].sum = (ll)(segtree[lson].r - segtree[lson].l+1)*segtree[r].same;
segtree[rson].sum = (ll)(segtree[rson].r - segtree[rson].l+1)*segtree[r].same;
segtree[r].same = 0;
}
} void make_euler(int i,int l,int r)
{
//区间修改
if(segtree[i].r <= r && segtree[i].l >= l && segtree[i].same)
{
segtree[i].same = (ll)euler[segtree[i].same];
segtree[i].sum = segtree[i].same*(ll)(segtree[i].r-segtree[i].l+1);
return;
}
if(l == r) return ;
int mid = (segtree[i].r +segtree[i].l) >>1;
push_down(i);
if(l <= mid)
make_euler(i<<1,l,r);
if(r > mid)
make_euler((i<<1)|1,l,r);
push_up(i);
}
void make_same(int i,int l,int r,ll c)
{
if(segtree[i].r <= r && segtree[i].l >= l)
{
segtree[i].same = c;
segtree[i].sum = segtree[i].same*(ll)(segtree[i].r-segtree[i].l+1);
return;
}
int mid = (segtree[i].r +segtree[i].l) >>1;
push_down(i);
if(l <= mid)
make_same(i<<1,l,r,c);
if(r > mid)
make_same((i<<1)|1,l,r,c);
push_up(i);
} ll get_sum(int i,int l,int r)
{
int mid = (segtree[i].l + segtree[i].r) >> 1;
if(segtree[i].l >= l && segtree[i].r <= r)
{
return segtree[i].sum;
}
push_down(i);
ll ans = 0;
if(l <= mid) ans += get_sum(i<<1,l,r);
if(r > mid) ans += get_sum(i<<1|1,l,r);
push_up(i);
return ans;
} int main()
{
int T,n,m;
getEuler();
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
build(1,1,n);
for(int i =1; i <= m; i++)
{
int op,l,r;
ll c;
scanf("%d",&op);
if(op == 1)
{
scanf("%d%d",&l,&r);
make_euler(1,l,r);
//debug();
}
else if(op == 2)
{
scanf("%d%d%I64d",&l,&r,&c);
make_same(1,l,r,c);
// debug();
}
else if(op == 3)
{
scanf("%d%d",&l,&r);
printf("%I64d\n",get_sum(1,l,r));
}
}
}
return 0;
}

  

hdu5634 BestCoder Round #73 (div.1)的更多相关文章

  1. hdu5631 BestCoder Round #73 (div.2)

    Rikka with Graph  Accepts: 123  Submissions: 525  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  2. hdu5630 BestCoder Round #73 (div.2)

    Rikka with Chess  Accepts: 393  Submissions: 548  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  3. BestCoder Round #73 (div.2)

    1001 Rikka with Chess ans = n / 2 + m / 2 1002 Rikka with Graph 题意:n + 1条边,问减去至少一条使剩下的图连通的方案数. 分析:原来 ...

  4. BestCoder Round #73 (div.2)(hdu 5630)

    Rikka with Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. BestCoder Round #73 (div.2)1002/hdoj5631

    题意: 给出一张 nnn 个点 n+1n+1n+1 条边的无向图,你可以选择一些边(至少一条)删除. 分析: 一张n个点图,至少n-1条边才能保证联通 所以可以知道每次可以删去1条边或者两条边 一开始 ...

  6. BestCoder Round #69 (div.2) Baby Ming and Weight lifting(hdu 5610)

    Baby Ming and Weight lifting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  7. BestCoder Round #68 (div.2) tree(hdu 5606)

    tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  8. BestCoder Round #11 (Div. 2) 题解

    HDOJ5054 Alice and Bob Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. hdu5635 BestCoder Round #74 (div.2)

    LCP Array  Accepts: 131  Submissions: 1352  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 13 ...

随机推荐

  1. XCode Build Settings中几种Search Paths

    Header search path:去查找头文件的路径,同在在你需要使用第三方库的时候,在这里设置你的头文件路径目录,如图 <code><span class="str& ...

  2. java JDK源码解析

    Hashmap 使用java语言进行系统开发时,使用得比较多得数据结构hashmap,它以[key,value],进行数据存储,通过key可以快速找到到对应的value值,但是key,value不能是 ...

  3. js 中bind

    function fn(a){ this.innerHTML = a; console.log(this); } //fn("hello"); span1.onclick =fun ...

  4. spring MVC中定义异常页面

    如果我们在使用Spring MVC的过程中,想自定义异常页面的话,我们可以使用DispatcherServlet来指定异常页面,具体的做法很简单: 下面看我曾经的一个项目的spring配置文件: 1 ...

  5. Docker学习笔记 - Docker的镜像

    一个容器实际上是运行在宿主机上的一个进程. 只不过在启动这个进程之前进行了一些特殊处理,让这个容器进入了一个全新的虚拟环境,与宿主机的环境分开, 所以这个进程及其子进程认为自己运行在一个独立的世界里面 ...

  6. Jetty入门(1-2)eclipse集成jetty插件并发布运行应用

    一.eclipse集成jetty插件 1.从市场安装jetty插件 2.使用jetty插件发布应用和配置运行环境 debug配置默认共用上述run配置 3.使用jetty插件启动运行和停止运行选中的应 ...

  7. zabbix配置微信报警

    首先我们先目睹下微信报警的效果 接下来我们正式开始操作. 一:注册企业微信. 打开企业微信注册:http://work.weixin.qq.com 根据以上提示填入相应的内容,然后注册即可. 二:登录 ...

  8. Python学习之dict和set

    #coding=utf-8 # dict dict= {'bob': 40, 'andy': 30} print dict['bob'] # 通过dict提供的get方法,如果key不存在,可以返回N ...

  9. jsp和servlet的区别和联系

    jsp和servlet的区别和联系:1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能 ...

  10. JAVA通过注解处理器重构代码,遵循单一职责

    前言:最近在看一个内部网关代码的时候,发现处理Redis返回数据这块写的不错,今天有时间好好研究下里面的知识点. 业务流程介绍: #项目是采用Spring Boot框架搭建的.定义了一个@Redis注 ...