Codeforces Round #157 (Div. 1) C. Little Elephant and LCM (数学、dp)

16 篇文章 0 订阅
C. Little Elephant and LCM
time limit per test
4 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The Little Elephant loves the LCM (least common multiple) operation of a non-empty set of positive integers. The result of the LCM operation of k positive integers x1, x2, ..., xk is the minimum positive integer that is divisible by each of numbers xi.

Let's assume that there is a sequence of integers b1, b2, ..., bn. Let's denote their LCMs as lcm(b1, b2, ..., bn) and the maximum of them as max(b1, b2, ..., bn). The Little Elephant considers a sequence b good, if lcm(b1, b2, ..., bn) = max(b1, b2, ..., bn).

The Little Elephant has a sequence of integers a1, a2, ..., an. Help him find the number of good sequences of integers b1, b2, ..., bn, such that for all i (1 ≤ i ≤ n) the following condition fulfills: 1 ≤ bi ≤ ai. As the answer can be rather large, print the remainder from dividing it by 1000000007 (109 + 7).

Input

The first line contains a single positive integer n (1 ≤ n ≤ 105) — the number of integers in the sequence a. The second line contains nspace-separated integers a1, a2, ..., an (1 ≤ ai ≤ 105) — sequence a.

Output

In the single line print a single integer — the answer to the problem modulo 1000000007 (109 + 7).

Sample test(s)

input
4
1 4 3 2
output
15
input
2
6 3
output
13

题意:
给你一个a序列,找出一个b序列,1 ≤ bi ≤ ai,使得max(bi)=lcm(bi),问这样的bi序列有多少个。
思路:
先对a排序,枚举i=max(bi),对i因式分解,那么大于等于i的部分很好处理,直接pow_mod()相减,小于i的部分就任意取一个约束就够了。
代码:
#include <iostream>  
#include<cstring>  
#include<cstdio>  
#include<string>  
#include<vector>  
#include<algorithm>  
#define INF 0x3f3f3f3f  
#define maxn 100005  
#define mod 1000000007  
typedef long long ll;  
using namespace std;  
  
int n;  
int a[maxn];  
  
ll pow_mod(ll x,ll n)  
{  
    ll res = 1;  
    while(n)  
    {  
        if(n&1) res = res * x %mod;  
        x = x * x %mod;  
        n >>= 1;  
    }  
    return res;  
}  
void solve()  
{  
    int i,j;  
    ll ans=0,res;  
    sort(a+1,a+n+1);  
    for(i=1;i<=a[n];i++) // 枚举答案  
    {  
        vector<int>fac;  
        for(j=1;j*j<=i;j++) // factor  
        {  
            if(i%j==0)  
            {  
                fac.push_back(j);  
                if(j*j!=i) fac.push_back(i/j);  
            }  
        }  
        sort(fac.begin(),fac.end());  
        int pos,pre=1;  
        res=1;  
        for(j=1;j<fac.size();j++)  
        {  
            pos=lower_bound(a+1,a+n+1,fac[j])-a;  
            res*=pow_mod(j,pos-pre);  
            res%=mod;  
            pre=pos;  
        }  
        ans+=res*((pow_mod(j,n-pre+1)-pow_mod(j-1,n-pre+1)+mod)%mod);  
        ans%=mod;  
    }  
    printf("%I64d\n",ans);  
}  
int main()  
{  
    int i,j;  
    while(~scanf("%d",&n))  
    {  
        for(i=1;i<=n;i++)  
        {  
            scanf("%d",&a[i]);  
        }  
        solve();  
    }  
    return 0;  
}  


题意:
给你一个a序列,找出一个b序列,1 ≤ bi ≤ ai,使得max(bi)=lcm(bi),问这样的bi序列有多少个。
 
 
思路:
先对a排序,枚举i=max(bi),对i因式分解,那么大于等于i的部分很好处理,直接pow_mod()相减,小于i的部分就任意取一个约束就够了。
 
 
代码:
 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值