乘除都在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. bulk_insert_buffer_size and InnoDB

    Q: I read the following on this page http://dev.mysql.com/doc/mysql/en/server-system-variables.html ...

  2. Install the AWS Command Line Interface on Linux

    Install the AWS Command Line Interface on Linux You can install the AWS Command Line Interface and i ...

  3. TypeConverter使用

    如下代码, <Window.Resources> <local:Human x:Key="human" Name="Tester1" Chil ...

  4. Linux命令的返回值

    转摘自:http://hi.baidu.com/suchshow/item/230255b6caab369218469732 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令, ...

  5. JavaScript中cookie使用

    转自:http://www.cnblogs.com/yjzhu/archive/2012/11/26/2789032.html 一.什么是 cookie? cookie 就是页面用来保存信息,比如自动 ...

  6. 问题总结——window平台下grunt\bower安装后无法运行的问题

    一.问题: 安装grunt或者bower后,在cmd控制台运行grunt -version 或者 bower -v会出现:“xxx不是内部或外部命令,也不是可运行的程序或批处理文件”,

  7. 复选框 checkbox 选中事件

    项目中用的jquery-1.11 今天需要检测一个checkbox的选中状态,想当然的用 .attr("checked") ,结果发现,无论是否选中,这个值都是 undefined ...

  8. 教主泡嫦娥(RQNOJ 595)

    题目描述 [问题背景] 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方舟上. 但也有很多百姓平民想搭乘方舟,毕竟他们不想就这么离开世界,所以他们决定要么登上 ...

  9. 【BZOJ4008】【HNOI2015】亚瑟王 [期望DP]

    亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 小 K 不慎被 LL 邪教洗脑了,洗 ...

  10. GitLab 密码重设

    内容全部来自: CSDN bisal GitLab 密码重设方法 假设注册邮箱为: abc@test.com 步骤 1) 登录 git 服务器 2) 执行: gitlab-rails console ...