链接:https://www.nowcoder.com/acm/contest/215/D
来源:牛客网

题目描述

“我不知道你在说什么,因为我只是个pupil。”--绿魔法师

一个空的可重集合S。
n次操作,每次操作给出x,k,p,执行以下操作:
1、在S中加入x。
2、输出

输入描述:

所有输入的数都是小于1e5+1的正整数。

输出描述:

输出对应的结果
示例1

输入

复制

3
4 1 9
5 2 8
6 3 7

输出

复制

4
2
1 题意 : 每次增加一个数,求新增加的数同前面每个数的gcd 的 k 次幂再对 p 取模,将答案累加
思路分析 :
  考虑每次增加一个数时,需要找到同前面每个数字的 gcd, 本质上的 gcd 就是当前数的约数中的某一个
  因此每插入一个新的元素时,就是相当于插入了当前这个数的所有的约数,从最大的约数开始插入,并且每次检索前面有此约数的数有多少个即可
  复杂度 n*w*w ,w 为这个数的约数个数,但实际在 w^2 枚举因数时的复杂度是不够 w^2 的
代码示例 :
#define ll long long
const ll maxn = 1e5+5; ll n;
ll x, k, p;
vector<ll>ve[maxn]; inline ll read() {
ll x = 0, f = 1; register char ch = getchar();
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0'&&ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x*f;
} inline void init() {
for(ll i = 1; i <= 100000; i++){
for(ll j = i; j <= 100000; j += i){
ve[j].push_back(i);
}
} } inline ll qw(ll x, ll cnt){
ll res = 1; while(cnt){
if (cnt&1) res *= x;
res %= p;
x *= x;
x %= p;
cnt >>= 1;
}
return res;
} ll cnt[maxn], del[maxn];
ll pp[maxn], pt[maxn];
inline void solve() {
for(ll i = 0; i < ve[x].size(); i++) cnt[ve[x][i]]++;
ll ans = 0;
ll c = 0;
for(ll i = ve[x].size()-1; i >= 0; i--){
ll num = ve[x][i];
if (cnt[num] <= del[num]) continue;
ans += (cnt[num]-del[num])*qw(num, k)%p;
ans %= p;
for(ll j = 0; j < ve[num].size(); j++){
ll f = ve[num][j];
del[f] += (cnt[num]-del[num]);
}
}
for(int i = 0; i < ve[x].size(); i++) del[ve[x][i]] = 0;
printf("%lld\n", ans);
} int main() {
init();
cin >> n;
for(ll i = 1; i <= n; i++){
x = read(), k = read(), p = read();
solve();
}
return 0;
}

wannafly 27 D 巧妙求取约数的更多相关文章

  1. java 求取某一段时间内的每一天、每一月、每一年

    1.求取某一段时间内的每一天 Date date0 = new SimpleDateFormat("yyyy-MM-dd").parse("2014-01-01" ...

  2. OpenCV 最小二乘拟合方法求取直线倾角

    工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿.在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv ...

  3. php自定义函数求取平方根

    <?phpfunction sqare($a, $left, $right){ $mid = ($left + $right)/2; if($mid * $mid == $a || (abs($ ...

  4. oracle 当前年到指定年的年度范围求取

    如下面公式所示,求取2015到当前年(2018)的年度范围,当前年是由系统获取的,用到了sysdate和函数to_char,to_date. 当然,当前年也可以换成指定年份 SELECT TO_CHA ...

  5. poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数

    poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数 题目大意:如题目所示 给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量), ...

  6. python 库 Numpy 中如何求取向量范数 np.linalg.norm(求范数)(向量的第二范数为传统意义上的向量长度),(如何求取向量的单位向量)

    求取向量二范数,并求取单位向量(行向量计算) import numpy as np x=np.array([[0, 3, 4], [2, 6, 4]]) y=np.linalg.norm(x, axi ...

  7. K:求取数组中最大连续子序列和的四个算法

    相关介绍:  求取数组中最大连续子序列和问题,是一个较为"古老"的一个问题.该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有 ...

  8. 使用C#版OpenCV进行圆心求取

    OpenCVSharp是OpenCV的.NET wrapper,是一名日本工程师开发的,项目地址为:https://github.com/shimat/opencvsharp. 该源码是 BSD开放协 ...

  9. 第3节 mapreduce高级:8、9、自定义分区实现分组求取top1

    自定义GroupingComparator求取topN GroupingComparator是mapreduce当中reduce端的一个功能组件,主要的作用是决定哪些数据作为一组,调用一次reduce ...

随机推荐

  1. Ubuntu 19.04安装phpipam软件

    1ftp下载xampp2安装xampp chmod 777sudo ./xampp.run3,ftp phpipam.tar.gz 解压 ./opt/lampp/www/phpipam/cp conf ...

  2. java Scanner(简单文本扫描器)

    Scanner(File source)  构造一个新的 Scanner,它生成的值是从指定文件扫描的. 备注:实现了Iterable接口   package june6D; import java. ...

  3. UVA 437 "The Tower of Babylon" (DAG上的动态规划)

    传送门 题意 有 n 种立方体,每种都有无穷多个. 要求选一些立方体摞成一根尽量高的柱子(在摞的时候可以自行选择哪一条边作为高): 立方体 a 可以放在立方体 b 上方的前提条件是立方体 a 的底面长 ...

  4. H3C 路由优先级

  5. Eclipse修改控制台字体

    步骤:Window-->Preference-->General-->Appearance-->Colors and Fonts-->Basic-->Text Fo ...

  6. 2018-8-10-win10-uwp-win2d-离屏渲染

    title author date CreateTime categories win10 uwp win2d 离屏渲染 lindexi 2018-08-10 19:17:19 +0800 2018- ...

  7. windows编译caffe2遇到的问题

    首先介绍下window编译caffe2整体流程: 说明:如果不需要python支持只需3.4即可,而且编译亦不会出现问题. 1. 安装python2.7,. 我使用的是anaconda python2 ...

  8. 【Linux】ssh-copy-id三步实现ssh免密登陆

    一.本地机器上使用ssh-keygen产生公钥私钥对 ssh-keygen -t rsa -C "XXXX@163.com" --->执行完会在~/.ssh/下生成公钥私钥对 ...

  9. filter 开发

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  10. seek方法补充

    seek 默认模式是从文件的开始移动光标,一共有0.1.2三种模式 f=open('seek.txt','r',encoding='utf-8') print(f.tell()) f.seek(10, ...