1. 程式人生 > >Codeforces Round #157 (Div. 1)C(因數分解+二分+組合數)

Codeforces Round #157 (Div. 1)C(因數分解+二分+組合數)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef long long ll;
const int MOD = (int)1e9+7;
const int MAXN = 100005;
int a[MAXN];
int stk[MAXN];
int siz[MAXN];
int isprime[MAXN];
int prime[MAXN];
int q[MAXN];
int pos[MAXN];
int dp[MAXN];
int tol;
int sz;
int top;

int add(int x,int y)
{
    x+=y;
    if(x>=MOD)x-=MOD;
    return x;
}

int sub(int x,int y)
{
    x-=y;
    if(x<0)x+=MOD;
    return x;
}

void getprime()
{
    isprime[1]=1;sz=0;
    for(int i=2;i<=100000;i++){
        if(isprime[i]==0){
            prime[sz++]=i;
            for(ll j=(ll)i*i;j<=100000;j+=i)
                isprime[j]=1;
        }
    }
}

void getdivisors(int x)
{
    top=0;
    int res=(int)sqrt(x+0.5);
    for(int i=0;i1){
    stk[top++]=x;
    siz[top-1]=1;
    }
}

int mpow(int x,int n)
{
    int ans=1;
    int temp=x;
    while(n){
        if(n&1)
            ans=(ll)ans*temp%MOD;
        n>>=1;
        temp=(ll)temp*temp%MOD;
    }
    return ans;
}


void dfs(int cent,int val)
{
    if(cent==top){
        q[tol++]=val;
        return;
    }
    dfs(cent+1,val);
    for(int i=1;i<=siz[cent];i++)
        dfs(cent+1,val*mpow(stk[cent],i));
}

int erfen(int l,int r,int x)
{
    int po=r+1;
    while(l<=r){
        int m=l+r>>1;
        if(a[m]>=x){
            po=m;
            r=m-1;
        }
        else l=m+1;
    }
    return po;
}

int main()
{
    getprime();
    int n,mx=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        mx=max(mx,a[i]);
    }
    sort(a+1,a+n+1);
    int ans=0;
    for(int i=1;i<=mx;i++){
        getdivisors(i);
        tol=0;
        dfs(0,1);
        sort(q,q+tol);
        for(int j=0;j