这道题拖到现在才AC,而且花了很长时间,前半个寒假+考试月1个半月的时间,没怎么打代码,手和脑生疏了不少....
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 100005
#define ll __int64
#define pb push_back
#define mod 1000000007
#define ss(a) scanf("%d",&a)
using namespace std;
int a[N],g[N];
vector<int>b;
void build(int n)
{
int i;
b.clear();
for (i=1;i*i<=n;i++)
if (n%i==0) b.pb(i);
for (i=b.size()-1;i>=0;i--)
if (b[i]*b[i]!=n) b.pb(n/b[i]);
return;
}
int search(int l,int r,int x)
{
if (r-l<=1)
{
if (a[r]<x) return r;
else return l;
}
int m=(l+r)>>1;
if (x>a[m]) return search(m,r,x);
else return search(l,m-1,x);
}
int powmod(int x,int y)
{
ll z=1,t=x;
while (y>0)
{
if (y&1) z=(z*t)%mod;
t=(t*t)%mod;
y>>=1;
}
return z;
}
int main()
{
int n,m,i,j,tmax=-1;
ss(n);
for (i=1;i<=n;i++)
{
ss(a[i]);
if (tmax<a[i]) tmax=a[i];
}
ll s,zs=0;
sort(a+1,a+n+1);
for (i=1;i<=tmax;i++)
{
build(i);
m=b.size();
g[0]=0;s=1;
for (j=1;j<m;j++)
if (b[j]<=a[1]) g[j]=0;
else
{
g[j]=search(1,n,b[j]);
s=s*powmod(j,g[j]-g[j-1])%mod;
}
s=s*((powmod(m,n-g[m-1])-powmod(m-1,n-g[m-1])+mod)%mod)%mod;
zs=(zs+s)%mod;
}
printf("%I64d\n",zs);
return 0;
}