当前位置:编程学习 > C/C++ >>

hdu 4392 Maximum Number Of Divisors

只跑了15ms,因为用了一个不能保证完全正确的剪枝,我猜想最优的情况一定能通过另一种最优的情况得到,即把任何一个最优解减少一个素数后可以找到另一种最优解和它对应,然后奇迹般的ac了~
#include<iostream> 
#include<vector> 
#include<algorithm> 
#include<cstdio> 
#include<queue> 
#include<stack> 
#include<string> 
#include<map> 
#include<set> 
#include<cmath> 
#include<cassert> 
#include<cstring> 
#include<iomanip> 
using namespace std; 
 
const int inf = 0x3f3f3f3f; 
const double oo = 10e9; 
const double eps = 10e-9; 
const double pi = acos(-1.0); 
 
#include <iostream> 
#include <cstring> 
using namespace std; 
 
#ifdef _WIN32 
#define i64 __int64 
#define out64 "%I64d\n" 
#define in64 "%I64d" 
#else 
#define i64 long long 
#define out64 "%lld\n" 
#define in64 "%lld" 
#endif 
 
#define DIGIT   4      //四位隔开,即万进制 
#define DEPTH   10000        //万进制 
#define MAX     23 
typedef int bignum_t[MAX+1]; 
 
/************************************************************************/ 
/* 读取操作数,对操作数进行处理存储在数组里                             */ 
/************************************************************************/ 
int read(bignum_t a,istream&is=cin) 

    char buf[MAX*DIGIT+1],ch ; 
    int i,j ; 
    memset((void*)a,0,sizeof(bignum_t)); 
    if(!(is>>buf))return 0 ; 
    for(a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--) 
    ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch ; 
    for(a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0'); 
    for(i=1;i<=a[0];i++) 
    for(a[i]=0,j=0;j<DIGIT;j++) 
    a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0' ; 
    for(;!a[a[0]]&&a[0]>1;a[0]--); 
    return 1 ; 

 
void write(const bignum_t a,ostream&os=cout) 

    int i,j ; 
    for(os<<a[i=a[0]],i--;i;i--) 
    for(j=DEPTH/10;j;j/=10) 
    os<<a[i]/j%10 ; 

 
int comp(const bignum_t a,const bignum_t b) 

    int i ; 
    if(a[0]!=b[0]) 
    return a[0]-b[0]; 
    for(i=a[0];i;i--) 
    if(a[i]!=b[i]) 
    return a[i]-b[i]; 
    return 0 ; 

 
int comp(const bignum_t a,const int b) 

    int c[12]= 
    { 
        1 
    } 
    ; 
    for(c[1]=b;c[c[0]]>=DEPTH;c[c[0]+1]=c[c[0]]/DEPTH,c[c[0]]%=DEPTH,c[0]++); 
    return comp(a,c); 

 
int comp(const bignum_t a,const int c,const int d,const bignum_t b) 

    int i,t=0,O=-DEPTH*2 ; 
    if(b[0]-a[0]<d&&c) 
    return 1 ; 
    for(i=b[0];i>d;i--) 
    { 
        t=t*DEPTH+a[i-d]*c-b[i]; 
        if(t>0)return 1 ; 
        if(t<O)return 0 ; 
    } 
    for(i=d;i;i--) 
    { 
        t=t*DEPTH-b[i]; 
        if(t>0)return 1 ; 
        if(t<O)return 0 ; 
    } 
    return t>0 ; 

/************************************************************************/ 
/* 大数与大数相加                                                       */ 
/************************************************************************/ 
void add(bignum_t a,const bignum_t b) 

    int i ; 
    for(i=1;i<=b[0];i++) 
    if((a[i]+=b[i])>=DEPTH) 
    a[i]-=DEPTH,a[i+1]++; 
    if(b[0]>=a[0]) 
    a[0]=b[0]; 
    else 
    for(;a[i]>=DEPTH&&i<a[0];a[i]-=DEPTH,i++,a[i]++); 
    a[0]+=(a[a[0]+1]>0); 

/************************************************************************/ 
/* 大数与小数相加                                                       */ 
/************************************************************************/ 
void add(bignum_t a,const int b) 

    int i=1 ; 
    for(a[1]+=b;a[i]>=DEPTH&&i<a[0];a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++); 
    for(;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++); 

/************************************************************************/ 
/* 大数相减(被减数>=减数)                                               */ 
/************************************************************************/ 
void sub(bignum_t a,const bignum_t b) 

    int i ; 
    for(i=1;i<=b[0];i++) 
    if((a[i]-=b[i])<0) 
    a[i+1]--,a[i]+=DEPTH ; 
    for(;a[i]<0;a[i]+=DEPTH,i++,a[i]--); 
    for(;!a[a[0]]&&a[0]>1;a[0]--); 

/******************************************************************
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,