#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 int64;
int n;
char m[ 110 ];
int mlen;
struct type
{
char a[ 110 ];
int len;
}f[ 20010 ];
bool cmp(type a,type b )
{
if(a.len < b.len)return 1;
else if( a.len == b.len )
{
if( strcmp(a.a,b.a) < 0 )return 1;
return 0;
}
return 0;
}
#define Size 250
void mutiply(char p1[],char p2[],char p[])//结果就在p[]中,适合正数
{
int i,j;
int len1 = strlen(p1);
int len2 = strlen(p2);
int c[ Size ]={0};
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
{
c[ i + j + 1 ] += ( p1[i] - '0' ) * ( p2[ j ] - '0' );
}
for(i=len1+len2-1;i>=0;i--)
{
if( c[i] >= 10 )
{
c[i-1] += c[i]/10;
c[i]%=10;
}
}
i=0;
while( c[i] == 0 )i++;
for(j=0;i<len1+len2;i++,j++)
p[j] = c[i] + '0';
p[j] = 0;
}
bool judge(int u,int v)
{
char str[ 250 ];
mutiply(f[u].a,f[v].a,str);
int len = strlen(str);
if( len < mlen || (len == mlen && strcmp(str,m) <0 ) )return 1;
return 0;
}
int countnum(int Index)
{
int bot = Index + 1, top = n - 1,mid;
int z=0;
while( bot <= top )
{
mid = (bot+top)>>1;
if( judge(Index,mid) )
{
bot = mid + 1;
z = mid - Index;
}
else top = mid - 1;
}
return z;
}
int64 solve()
{
sort(f,f+n,cmp);
int i;
int64 z = 0;
int tp;
for(i=0;i<n;i++)
{
tp = countnum(i);
z += tp;
}
return z;
}
int main()
{
int i;
int64 ans;
while( scanf("%d",&n) && n )
{
scanf("%s",m);
mlen = strlen(m);
for(i=0;i<n;i++)
{
scanf("%s",f[i].a);
f[i].len = strlen(f[i].a);
}
ans = solve();
printf("%I64d\n",ans);
}
}
SeedCoder2014热身题目6: 解答
最新推荐文章于 2014-04-03 20:43:25 发布