乘除都在150以内,分解质因数后发现只有35个,建立35个树状数组/线段树,做区间加、区间查询,最后快速幂起来。

#include<cstdio>
#include<cstring>
using namespace std;
#define N 50001
typedef long long ll;
ll Quick_Pow(ll a,ll p,ll MOD)
{
if(!p) return 1;
ll ans=Quick_Pow(a,p>>1,MOD);
ans=ans*ans%MOD;
if((p&1)==1) ans=ans*a%MOD;
return ans;
}
int zu,n,m;
int prime[151],en,zyz[151][40];
bool vis[151];
struct BIT
{
ll d[N];
void add_node(int p,const ll &v)
{for(;p<=n;p+=(p&(-p)))d[p]+=v;}
ll query(int p)
{ll res=0;for(;p;p-=(p&(-p)))res+=d[p];return res;}
void clear(){memset(d,0,sizeof(d));}
}T[40];
struct BIT2
{
ll d[N];
void add_node(int p,const ll &v)
{for(;p<=n;p+=(p&(-p)))d[p]+=v;}
void add_range(const int &L,const int &R,const ll &v)
{add_node(L,v);if(R!=n)add_node(R+1,-v);}
ll query(int p)
{ll res=0;for(;p;p-=(p&(-p)))res+=d[p];return res;}
void clear(){memset(d,0,sizeof(d));}
}T2[40];
void Shai()
{
vis[1]=1;
for(int i=2;i<=150;i++)
{
if(!vis[i]) prime[++en]=i;
for(int j=i*i;j<=150;j+=i)
vis[j]=1;
}
}
void add(const int &wh,const int &p,const int &v)
{
T[wh].add_node(p,(ll)v*(ll)p);
if(p!=1) T2[wh].add_range(1,p-1,(ll)v);
}
void Add(const int &wh,const int &L,const int &R,const int &v)
{
add(wh,R,v);
if(L!=1) add(wh,L-1,(ll)(-v));
}
ll query(const int &wh,const int &p)
{
return T[wh].query(p)+T2[wh].query(p)*(ll)p;
}
ll Query(const int &wh,const int &L,const int &R)
{
return query(wh,R)-(L==1?0:query(wh,L-1));
}
ll QUERY(const int &wh,const int &L,const int &R)
{
if(L<=R) return Query(wh,L,R);
else return Query(wh,L,n)+Query(wh,1,R);
}
int main()
{
int op,x,y,v;
Shai();
for(int i=1;i<=150;++i)
{
int t=i;
for(int j=1;j<=en;++j)
while(t%prime[j]==0)
{
t/=prime[j];
++zyz[i][j];
}
}
scanf("%d",&zu);
for(;zu;--zu)
{
for(int i=1;i<=en;++i)
{
T[i].clear();
T2[i].clear();
}
scanf("%d%d",&n,&m);
for(;m;--m)
{
scanf("%d%d%d%d",&op,&x,&y,&v);
if(op==1)
{
for(int i=1;i<=en;++i)
if(zyz[v][i])
{
if(x<=y)
Add(i,x,y,zyz[v][i]);
else
{
Add(i,x,n,zyz[v][i]);
Add(i,1,y,zyz[v][i]);
}
}
}
else if(op==2)
{
for(int i=1;i<=en;++i)
if(zyz[v][i])
{
if(x<=y)
Add(i,x,y,-zyz[v][i]);
else
{
Add(i,x,n,-zyz[v][i]);
Add(i,1,y,-zyz[v][i]);
}
}
}
else
{
ll ans=1;
for(int i=1;i<=en;++i)
ans=(ans*Quick_Pow((ll)prime[i],QUERY(i,x,y),(ll)v))%(ll)v;
printf("%I64d\n",ans);
}
}
}
return 0;
}

【分解质因数】【树状数组】【快速幂】codeforces 2014 ACM-ICPC Vietnam National Second Round E. ACM的更多相关文章

  1. 【牛客小白月赛6】F 发电 - 树状数组&快速幂&逆元

    题目地址:https://www.nowcoder.com/acm/contest/136/F 树状数组.快速幂.逆元的模板运用: #include<iostream> #include& ...

  2. poj2182Lost Cows——树状数组快速查找

    题目:http://poj.org/problem?id=2182 从后往前确定,自己位置之前没有被确定的且比自己编号小的个数+1即为自己的编号: 利用树状数组快速查找,可另外开一个b数组,角标为编号 ...

  3. Codeforces 1053C Putting Boxes Together 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1053C.html 题目传送门 - CF1053C 题意 有 $n$ 个物品,第 $i$ 个物品在位置 $a ...

  4. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) E. Cards Sorting 树状数组

    E. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  5. 1042.D Petya and Array 前缀 + 树状数组

    11.19.2018 1042.D Petya and ArrayNew Point: 前缀 + 树状数组 :树状数组逐个维护前缀个数 Describe: 给你一个数组,一个标记数,问你有多少区间[l ...

  6. 【bzoj4378】[POI2015]Logistyka 离散化+树状数组

    题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作.每次 ...

  7. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  8. [CSP-S模拟测试]:斯诺(snow)(数学+前缀和+树状数组)

    题目传送门(内部题37) 输入格式 第一行一个整数$n$,表示区间的长度. 第二行一个长度为$n$的只包含$0,1,2$的字符串,表示给出的序列. 输出格式 一行一个整数,表示革命的区间的数量. 样例 ...

  9. Codeforces - 828E DNA Evolution —— 很多棵树状数组

    题目链接:http://codeforces.com/contest/828/problem/E E. DNA Evolution time limit per test 2 seconds memo ...

随机推荐

  1. PowerMock

    EasyMock 以及 Mockito 都因为可以极大地简化单元测试的书写过程而被许多人应用在自己的工作中,但是这 2 种 Mock 工具都不可以实现对静态函数.构造函数.私有函数.Final 函数以 ...

  2. Mysql History list length 值太大引起的问题

    1. 环境 Mysql 主从 Mysql版本:5.1.49-log 系统:Red Hat Enterprise Linux Server release 5.4  64bit 2. 表面现象 数据库操 ...

  3. [codeforces gym Matrix God]随机矩阵乘法

    题目链接:http://codeforces.com/gym/101341/problem/I 随机真是一个神奇的方法.原本矩阵乘法是n^3的复杂度,但是这个题是让判断两个矩阵是否相等,只需要在两个矩 ...

  4. Django随笔 01

    Django 视图 不处理用户输入,而仅仅决定要展现哪些数据给用户: Django 模板 仅仅决定如何展现Django视图指定的数据. dd http://blog.csdn.net/pipisorr ...

  5. Html 让文字显示在图片的上面

    如题: 第一种方式便是将 image 作为背景图片,即:background-image:url("......."); 在此可以控制背景图片的横向和纵向的平铺: backgrou ...

  6. Ubuntu下hadoop集群搭建

    --修改IP地址(克隆镜像后可修改可不修改) http://jingyan.baidu.com/article/e5c39bf5bbe0e739d7603396.html -------------- ...

  7. 【CF103D】Time to Raid Cowavans(分块)

    题意: 思路:院赛防AK题,然而还没来得及做就被数据出锅的题坑了…… #include<cstdio> #include<cstring> #include<string ...

  8. apache工作模式

    查看当前apache的工作模式 apachectl -l prefork模式 <IfModule prefork.c>StartServers 5MinSpareServers 5MaxS ...

  9. sql 批量更新表中多字段为不同的值

    ,),,),rand()) select newid() ,) update tablename , FB,)) , ), FC,)) , )

  10. [bzoj4516][Sdoi2016]生成魔咒——后缀自动机

    Brief Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生 ...