题意:求所有自己的最小公倍数的和。 该集合是  2^ai  * 3^bi

思路:线段树。 线段树中存的是  【3^b * f(b)】   f(b)表示 因子3 的最小公倍数3的部分  为 3^b的个数  那么从小到大枚举a  对于当前的  ab  ,  如果之前的b小于当前的b  那么最小公倍数就为  (2^a) *  (3^b)   个数 就为 2^x     x表示a  b 都小于当前a b的个数 。  大于的部分 就直接是  2^a   * 线段树上【b,max】的和。   求好当前更新进去,对于 【b,max】 区间 直接乘2 (表示当前这个b可选可不选) 。       b位置加上(2^x)  * (3^b) 的值即可(当前b被选为最大的b时的个数)。

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include <iostream>
#define lson i<<1
#define rson i<<1|1
#define LL long long
#define N 100050
#define MOD 1000000007
using namespace std;
int cnt[N*],val[N*],sum[N*],mul[N*];
int mypow(int a,int b)
{
int res=;
while(b)
{
if(b&)
res=(LL)res*a%MOD;
a=(LL)a*a%MOD;
b>>=;
}
return res;
}
int qa[N],qb[N];
void build(int l,int r,int i)
{
cnt[i]=sum[i]=;
mul[i]=;
if(l==r)
{
val[i]=mypow(,qb[l]);
return ;
}
int mid=(l+r)>>;
build(l,mid,lson);
build(mid+,r,rson);
}
void pushdown(int i)
{
if(mul[i]!=)
{
mul[lson]=(LL)mul[lson]*mul[i]%MOD;
mul[rson]=(LL)mul[rson]*mul[i]%MOD;
sum[lson]=(LL)sum[lson]*mul[i]%MOD;
sum[rson]=(LL)sum[rson]*mul[i]%MOD;
mul[i]=;
}
}
void pushup(int i)
{
cnt[i]=cnt[lson]+cnt[rson];
sum[i]=(sum[lson]+sum[rson])%MOD;
}
void update(int l,int r,int pl,int pr,int type,int va,int i)
{
if(l>=pl&&r<=pr)
{
if(type==)
{
mul[i]=(LL)mul[i]*va%MOD;
sum[i]=(LL)sum[i]*va%MOD;
}else
{
cnt[i]++;
sum[i]+=(LL)val[i]*va%MOD;
if(sum[i]>=MOD)sum[i]-=MOD;
}
return ;
}
pushdown(i);
int mid=(l+r)>>;
if(mid>=pl)update(l,mid,pl,pr,type,va,lson);
if(pr>mid)update(mid+,r,pl,pr,type,va,rson);
pushup(i);
}
int query(int l,int r,int pl,int pr,int type,int i)
{
if(l>=pl&&r<=pr)
{
if(type==)return sum[i];
else return cnt[i];
}
pushdown(i);
int mid=(l+r)>>;
int tmp=;
if(pl<=mid)tmp+=query(l,mid,pl,pr,type,lson);
if(pr>mid)tmp+=query(mid+,r,pl,pr,type,rson);
if(tmp>=MOD)tmp-=MOD;
return tmp;
}
struct node
{
int a,b;
}s[N];
bool cmp(node a,node b)
{
return a.a<b.a;
}
int main() {
int n;
while(scanf("%d",&n)!=EOF)
{
int taila,tailb;
taila=tailb=;
for(int i=;i<n;++i)
{
scanf("%d%d",&s[i].a,&s[i].b);
qa[taila++]=s[i].a;
qb[tailb++]=s[i].b;
}
sort(s,s+n,cmp);
sort(qa,qa+taila);
sort(qb,qb+tailb);
taila=unique(qa,qa+taila)-qa;
tailb=unique(qb,qb+tailb)-qb;
int maxn=tailb-;
build(,maxn,);
int ans=;
for(int i=;i<n;++i)
{
int x=lower_bound(qb,qb+tailb,s[i].b)-qb;
int tmp=(LL)mypow(,s[i].a)*mypow(,s[i].b)%MOD;
int cc=;
if(x>)
{
cc=query(,maxn,,x-,,);
tmp=(LL)tmp*mypow(,cc)%MOD;
}
int tmp2=(LL)mypow(,s[i].a)*query(,maxn,x,maxn,,)%MOD;
tmp+=tmp2;
if(tmp>=MOD)tmp-=MOD;
ans+=tmp;
if(ans>=MOD)ans-=MOD;
// printf("::%d %d\n",x,maxn);
update(,maxn,x,maxn,,,);
update(,maxn,x,x,,mypow(,cc),);
}
printf("%d\n",(ans%MOD+MOD)%MOD);
} return ;
}

HDU 4913 Least common multiple(2014 Multi-University Training Contest 5)的更多相关文章

  1. HDU 4913 Least common multiple

    题目:Least common multiple 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4913 题意:有一个集合s,包含x1,x2,...,xn, ...

  2. ACM学习历程—HDU 3092 Least common multiple(数论 && 动态规划 && 大数)

    Description Partychen like to do mathematical problems. One day, when he was doing on a least common ...

  3. hdu 5003 模拟水题 (2014鞍山网赛G题)

    你的一系列得分 先降序排列 再按0.95^(i-1)*ai 这个公式计算你的每一个得分 最后求和 Sample Input12530 478Sample Output984.1000000000 # ...

  4. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  5. 千寻浏览器 1.0 Beta 1(524)(2014年5月27日)

    千寻浏览器--又一款新生浏览器今天进入各位浏览迷的视野.千寻浏览器基于IE内核,据传是由百度浏览器的上海团队操刀,在功能定位上,与目前的QQ浏览器有些相似. 千寻来自官方的解释:寻,追寻,探索,又是古 ...

  6. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  7. ( 2018 Multi-University Training Contest 2)

    2018 Multi-University Training Contest 2) HDU 6311 Cover HDU 6312 Game HDU 6313 Hack It HDU 6314 Mat ...

  8. hdu 2028 Lowest Common Multiple Plus(最小公倍数)

    Lowest Common Multiple Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. HDU——1019Least Common Multiple(多个数的最小公倍数)

    Least Common Multiple Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

随机推荐

  1. 将n*n矩阵顺时针旋转90度

    /** * 将n*n矩阵顺时针旋转90度 * @param mat * @param n 矩阵的阶数 * @date 2016-10-7 * @author shaobn */ public stat ...

  2. Egret官方案例学习笔记

    1.资源记载方式 (1)Egret引擎是2.0.5. (2)resource/resource.json文件是: { "resources": [ { "name&quo ...

  3. 删除已经配置的类库和移除CocoaPods[转]

    转自:http://blog.csdn.net/jymn_chen/article/details/19213601 引言 在使用CocoaPods(一)为项目配置第三方类库我们使用CocoaPods ...

  4. web工程目录结构

    /WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/包含了站点所有用的 class 文件,包括 ser ...

  5. 基于webrtc的资源释放问题(一)

    基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...

  6. [转]使用xcode4 workspace 多个project协同工作

    转载地址:http://erlangprogram.com/use-xcode4-workspace   一般的某个应用单独新建一个 project 就可以了,然后把所有的程序文件都放在里面,这个可以 ...

  7. 为什么要在html和body加上“height:100%;”

    元素中有内容的时候div才能被撑起来所以我给div加了背景但是也不显示,就是因为没有内容,这个时候的解决办法就是 html,body{ height:100%; }

  8. ContentProvider总结

    一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...

  9. canvas 绘图

    <canvas>元素是HTML5中的绘图元素,通过定义一个画布区域,然后使用javascript动态地在这个区域里面绘制图形,对于2D和3D图形都可以绘制,我们将其分成2D上下文和WebG ...

  10. C# 蓝牙编程

    C#进行蓝牙编程 本节我们给大家用源码的形式给大家介绍如何用C#调用蓝牙.下面的源码是基于destop的C#调用蓝牙的程序,也就是使用普通版本的.NET Framework来调用编程,一般是有蓝牙的笔 ...