您的位置:首页 > 其它

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

2014-11-05 22:53 309 查看
C. Little Elephant and LCMtime limit per test4 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputThe 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 positiveintegers x1, x2, ..., xk isthe 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) andthe 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 followingcondition fulfills: 1 ≤ bi ≤ ai.As the answer can be rather large, print the remainder from dividing it by 1000000007 (109 + 7).InputThe first line contains a single positive integer n (1 ≤ n ≤ 105) —the number of integers in the sequence a. The second line contains nspace-separatedintegers a1, a2, ..., an (1 ≤ ai ≤ 105) —sequence a.OutputIn 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
;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的部分就任意取一个约束就够了。
代码:

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: