bzoj3114 LCM Pair Sum
题意:以质因数分解的方式给定n,求所有满足:lcm(a, b) = n的无序数对的价值和。其中(a, b)的价值为a + b
解:
定义首项为a,公比为q,项数为n的等比数列的和为getQ(a, q, n)
首先考虑只有一个质因数,例如4。
有如下数对:(1, 4), (2, 4), (4, 4)
可得答案为getQ(1, 2, 2) + 43
然后扩展:6。
对于每个质因数来说:
2: (1, 2), (2, 2)
3: (1, 3), (3, 3)
两两乘起来之后发现:少了一项(2, 3),这是由于我们用的是无序数对。那么改成有序数对试试。
2: 3:
(1, 2) (1, 3)
(2, 1) (3, 1)
(2, 2) (3, 3)
交叉相乘:
(1, 6) (3, 2) (3, 6)
(2, 3) (6, 1) (6, 3)
(2, 6) (6, 2) (6, 6)
发现所有无序数对除了(6, 6)之外都出现了两次,于是补上一个(6, 6)之后/2即可。
现在考虑如何求交叉相乘的表。
设我们的两列数对如下:
(a, b) (e, f)
(c, d) (g, h)
要求的式子:
ae + bf + ag + bh + ce + df + cg + dh
因式分解:
(a + c)(e + g) + (b + d)(f + h)
考虑我们一开始列出来的某一列:
2:
(1, 2)
(2, 1)
(2, 2)
可得:a + c = b + d
故上式 = 2(a + c)(e + g)
推广:
设n = Πaipi,则ans = 2Π{getQ(1, a[i], p[i] + 1) + pi * aipi}
复杂度TmlogV,其中V为指数值域。
#include <cstdio> typedef long long LL;
const int N = ;
const LL MO = 1e9 + ; int a[N], p[N]; inline LL qpow(LL a, LL b) {
LL ans = ;
while(b) {
if(b & ) {
ans = ans * a % MO;
}
a = a * a % MO;
b = b >> ;
}
return ans;
} inline LL getQ(LL a, LL q, LL n) {
a %= MO;
if(!n) {
return 0ll;
}
if(n == || !a || !q) {
return a;
}
if(n == ) {
return (a + a * q % MO) % MO;
}
if(n & ) {
return (a + getQ(a * q % MO, q, n - )) % MO;
}
return (qpow(q, n >> ) + ) * getQ(a, q, n >> ) % MO;
} inline void solve() {
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d%d", &a[i], &p[i]);
}
LL ans = , sum = ;
for(int i = ; i <= n; i++) {
LL temp = qpow(a[i], p[i]) * p[i] % MO;
(temp += getQ(, a[i], p[i] + )) %= MO;
ans = ans * temp % MO;
(sum *= qpow(a[i], p[i])) %= MO;
//printf("temp : %lld \n", temp);
}
//printf("sum = %lld \n", sum);
ans = (ans + sum + sum) % MO;
ans = ans * ((MO + ) >> ) % MO;
printf("%lld\n", ans);
return;
} int main() { int T;
scanf("%d", &T);
for(int i = ; i <= T; i++) {
printf("Case %d: ", i);
solve();
} return ;
}
AC代码
题外话:这东西是我在某个最小割练习题表里面看到的......
bzoj3114 LCM Pair Sum的更多相关文章
- uva12546. LCM Pair Sum
uva12546. LCM Pair Sum One of your friends desperately needs your help. He is working with a secret ...
- light oj 1236 - Pairs Forming LCM & uva 12546 - LCM Pair Sum
第一题给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,……em, 则结果为((1+2*e1)*(1+2*e2)……(1+2*em)+1)/2. 代码如下: #include <st ...
- UVA12546_LCM Pair Sum
题目的意思是求 [西伽马(p+q)]其中lcm(p,q)=n. 又见数论呀. 其实这个题目很简单,考虑清楚了可以很简单的方法飘过. 我一开始是这样来考虑的. 对于每一个单独的质因子,如果为p,它的次数 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Subarray Sum Closest
Question Given an integer array, find a subarray with sum closest to zero. Return the indexes of the ...
- LeetCode 1099. Two Sum Less Than K
原题链接在这里:https://leetcode.com/problems/two-sum-less-than-k/ 题目: Given an array A of integers and inte ...
- [LC] 1099. Two Sum Less Than K
Given an array A of integers and integer K, return the maximum S such that there exists i < j wit ...
- 【LeetCode】1099. Two Sum Less Than K 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力求解 日期 题目地址:https://leetco ...
- Java中的泛型 (上) - 基本概念和原理
本节我们主要来介绍泛型的基本概念和原理 后续章节我们会介绍各种容器类,容器类可以说是日常程序开发中天天用到的,没有容器类,难以想象能开发什么真正有用的程序.而容器类是基于泛型的,不理解泛型,我们就难以 ...
随机推荐
- Django Rest Framework源码剖析(八)-----视图与路由
一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...
- 20155210 Exp2 后门原理与实践
20155210 Exp2 后门原理与实践 1.Windows获得Linux Shell 在windows下,打开CMD,使用ipconfig指令查看本机IP 如图: 然后使用ncat.exe程序,n ...
- Python+Selenium爬取动态加载页面(2)
注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...
- 蒙特卡罗方法 python 实现
蒙特卡罗(Monte Carlo)方法的精髓:用统计结果去计算频率,从而得到真实值的近似值. 一.求圆周率的近似值,采用 投点法 import numpy as np import matplotli ...
- 一步一步来熟悉Akka.Net(一)
一步一步来熟悉Akka.Net(一) 标签(空格分隔): .netcore 分布式 一.不利flag 好久没写过文章了,翻开前几年写的博客,看到有两个目标"代码生成器"和&qu ...
- Android——界面特效 相关知识总结贴
帮助android UI实现动画特效 http://www.apkbus.com/android-79595-1-1.html 帮助android应用程序实现动画特效 http://www.apkbu ...
- Js_特效
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcE ...
- 用Unity简单实现第三人称人物的移动和转向
上图不重要,因为实现人物的移动用的是动画,没有什么可说的,主要是下面实现人物的转向. 比如在一个平面中,玩家按了w和d键则人物会面向右前方向前进,如果此时玩家按了a和s键则人物会面向左后方向前进,那么 ...
- Flink standalone模式作业执行流程
宏观流程如下图: client端 生成StreamGraph env.addSource(new SocketTextStreamFunction(...)) .flatMap(new FlatMap ...
- EOS开发基础之五:使用cleos命令行客户端操作EOS——智能合约之Exchange
先回答一下上一节中留下的问题,为什么我就看不到eosio这个账户中的钱呢?我明明为它create了很多token啊. 对,你是create了,但是没有issue啊.create了1000000000 ...