题意:求所有自己的最小公倍数的和。 该集合是  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. startssl,免费的ssl证书申请及注意事项

    免费的ssl证书,https://www.startssl.com/ 安装到IIS和Nginx有所不同.原文 http://blog.newnaw.com/?p=1232 ------------转自 ...

  2. JavaScript encodeURI(), decodeURI(), encodeURIComponent(), decodeURIComponent()

    URI:  Uniform Resource Identifier encodeURI() And decodeURI() The encodeURI() function is used to en ...

  3. 什么是BOM头

    什么是BOM头? BOM头是放在UTF-8编码的文件的头部的,占用三个字节,用来标识该文件属于UTF-8编码.现在已经有很多软件识别BOM头,但是还有些不能识别BOM头,比如PHP就不能识别BOM头, ...

  4. zigbee学习之路(一):zigbee介绍

    一.前言 大家好,我是一名在校的大学生,最近对zigbee非常感兴趣,于是自己从网上买了一款秉火cc2530的zigbee开发板,想通过这个平台来和大家分享自己学习和研究的经历,下面就来简单的介绍下z ...

  5. Lost Cows(线段树 POJ2182)

    Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10354 Accepted: 6631 Descriptio ...

  6. javscript 中的术语和俚语

    语言中俚语和方言.在JavaScript中也有一些俚语或者说是术语,看似奇淫巧技,还是有一些用处,有三种语言组件可以来构造术语:强转.逻辑运算符和位变换. 1.强转:在javascript和大部分的语 ...

  7. Flowplayer-playlist

    SOURCE URL: https://flowplayer.org/docs/playlist.html HTML layout Here is a typical setup for a play ...

  8. 【前端】String.prototype.match() 用法详解

    var str="1 plus 2 equal 3" // 正则表达式 console.log(str.match(/\d+/g)); // ["1", &qu ...

  9. sql视图实例

    一个视图是一个或一组SQL语句,存储在数据库中相关的名称.一个视图实际上是一个预定义的SQL查询中的表的形式组成. 一个视图可以包含一个表的所有行,或选择表中的行.从一个或多个表上写SQL查询创建一个 ...

  10. 如何很好的使用Linq的Distinct方法

    Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...