[jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)
题目链接:
http://172.16.0.132/senior/#main/show/4668
题目:

题解:
考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因数的元素对应的这个质因数的指数
我们可以枚举质因数分别处理。为什么时间复杂度是对的呢?因为对于任何一个元素质因数种类是不会很多的,而对于每个质因数我们仅考虑包含它的数而不是全部扫一遍,因而是对的
枚举质因数之后,我们得到它对应的指数序列。对于小于等于根号1e7的质因数,考虑把这个指数序列从小到大,对于某个位置与之前位置的贡献就是靠前位置的指数,因此我们不断累加前缀统计答案就好了;对于另外的质因数,可以发现包含它的指数序列只能是1,所以我们不需要排序可以直接得到答案(注意到要求计算的数列其实就是元素之间两两只算一次,但注意还需要算上和本身的gcd)
这个模数比较坑,直接乘取模的话会爆long long,因此我们采用慢速乘(不是类似快速幂的那种)
比如x*y,我们令inf=1e7
$a1=x \mod inf$
$a2=x/inf$
$b1=y \mod inf$
$b2=y/inf$
我们拆开来计算就是了,具体看代码
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll; const int N=4e4+;
const ll mo=1e11+;
const int M=1e6+;
const ll inf=1e7+;
int n,cnt;
int a[N],vis[inf];
ll p[N];
vector <int> pi[M];
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void div(int x)
{
for (int i=;i*i<=x;i++)
{
if (x%i) continue;
if (!vis[i]) p[++cnt]=i,vis[i]=cnt;
int s=;
while (x%i==) x/=i,++s;
pi[vis[i]].push_back(s);
}
if (x>)
{
if (!vis[x]) p[++cnt]=x,vis[x]=cnt;
pi[vis[x]].push_back();
}
}
ll mul(ll x,ll y)
{
ll a1=x%inf;
ll a2=x/inf;
ll b1=y%inf;
ll b2=y/inf;
ll re=;
re=(re+a2*inf%mo*b2%mo*inf%mo)%mo;
re=(re+a2*inf%mo*b1%mo)%mo;
re=(re+a1*inf%mo*b2%mo)%mo;
re=(re+a1*b1%mo)%mo;
return re;
}
ll qpow(ll x,ll y)
{
ll re=;
for (;y;y>>=,x=mul(x,x)) if (y&) re=mul(re,x);
return re;
}
int main()
{
n=read();
for (int i=;i<=n;i++) a[i]=read(),div(a[i]);
ll ans=;
for (int i=;i<=cnt;i++)
{
if (1ll*p[i]*p[i]<=inf)
{
int pnt=pi[i].size();
sort(pi[i].begin(),pi[i].end());
ll s=;
for (int j=;j<pnt;j++)
{
ans=mul(ans,qpow(p[i],s));
s+=pi[i][j];
}
}
else
{
ll c=pi[i].size();
ans=mul(ans,qpow(p[i],c*(c-)/));
}
}
for (int i=;i<=n;i++) ans=mul(ans,1ll*a[i]);
printf("%lld\n",ans);
return ;
}
[jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)的更多相关文章
- [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)
题目链接: http://172.16.0.132/senior/#main/show/100026 题目: 有一个$n$个点$n$条边的有向图,每条边为$<i,f(i),w(i)>$,意 ...
- [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)
题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...
- 【NOIP2016提高A组模拟8.19】(雅礼联考day2)总结
第一题又有gcd,又有xor,本来想直接弃疗,不过后来想到了个水法: 当两个相邻的数满足条件时,那么他们的倍数也可能满足条件.然后没打,只打了个暴力. 正解就是各种结论,各种定理搞搞. 第二题,想都不 ...
- 【NOIP2016提高A组模拟8.19】(雅礼联考day2)公约数
题目 给定一个正整数,在[1,n]的范围内,求出有多少个无序数对(a,b)满足gcd(a,b)=a xor b. 分析 显然a=b是一定不满足, 我们设\(a>b\), 易得gcd(a,b)&l ...
- 【NOIP2016提高A组模拟8.19】(雅礼联考day2)树上路径
题目 给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E.(k为路径p上的边的权值和). 分析 点分治,设当前为x的,求在以x为根的子树中,经过x的路径(包括起点或 ...
- 【JZOJ4715】【NOIP2016提高A组模拟8.19】树上路径
题目描述 给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E.(k为路径p上的边的权值和) 输入 第一行给出N,S,E.N代表树的点数,S,E如题目描述. 下面N- ...
- [JZOJ 5437] [NOIP2017提高A组集训10.31] Sequence 解题报告 (KMP)
题目链接: http://172.16.0.132/senior/#main/show/5437 题目: 题解: 发现满足上述性质并且仅当A序列的子序列的差分序列与B序列的差分序列相同 于是我们把A变 ...
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
随机推荐
- Java-SpringCloud:目录
ylbtech-Java-SpringCloud:目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:htt ...
- java中拦截器 过滤器 监听器都有什么区别
过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts2的action进行业务逻辑,比如过滤掉非法u ...
- Hibernate框架学习(九)——Criteria语法
一.语法 1.基本查询 2.条件查询 3.分页查询 4.排序查询 5.统计查询 二.离线查询 1.非离线的Criteria 2.离线的Criteria 3.演示 public class Demo2 ...
- PHP中的类函数和类对象
1.class_exists()函数接受表示类的字符串,检查并返回布尔值.如果类存在,返回true,否则返回false: echo class_exists('Computer'); 2.get_cl ...
- Stack Overflow大揭密:哪一种程序员工资最高?
Stackoverflow在程序员之间可以說是无人不知无人不晓,甚至常有人开玩笑说:“如果stackoverflow倒闭了,全世界代码的产出率将下降一半以上”或许听起来有点夸张,但是不难想像这个网站在 ...
- 使用命令:ssh-add 时,出现 “Could not open a connection to your authentication agent.”
为 GitHub 账号设置 SSH Key时, 使用命令:ssh-add,出现“Could not open a connection to your authentication agent”,解决 ...
- office2016 下载直通车
下载地址 微软官方序列号(产品激活密钥):NKGG6-WBPCC-HXWMY-6DQGJ-CPQVG. 激活工具下载 分享源地址
- WebService 布置简单的计算器
实验环境:myeclipse2015 具体的过程如下: 首先建立一个web service project 命名就为WebServiceProject,同时选择web service framewor ...
- Windows系统环境变量、JAVA环境变量配置以及JVM加载过程
一:用户变量和系统变量的区别 右击我的电脑.属性.高级系统设置.环境变量. 对话框的上面为Administrator的用户变量,对话框的下面为系统变量.我们所说的环境变量一般指系统环境变量,对所有用户 ...
- COJS 1752. [BOI2007]摩基亚Mokia
1752. [BOI2007]摩基亚Mokia ★★★ 输入文件:mokia.in 输出文件:mokia.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 摩尔瓦 ...