test-38 solution hackerrank
1)
#include <stdio.h>
#define P 1000000007LL
long long I,g,b[1000], r,h,a[2000000],i,j,k,l,m,n, s[2000000],t,min, v[200000];
long long obsah(long long nn)
{
long long vv=1, ii;
for(ii=0;ii<k;ii++) vv = (vv*(b[ii]/nn))%P;
return vv;
}
long long next(long long jj)
{
long long kk,ii, ne;
kk = b[0]/jj;
ne = b[0]/kk + 1;
for(ii=1;ii<k;ii++)
{
kk = b[ii]/jj;
if(ne > b[ii]/kk +1) ne = b[ii]/kk + 1;
}
return ne;
}
int main()
{
scanf("%lld",&t);
while(t)
{
t--;
scanf("%lld",&k);
for(i=0;i<k;i++) scanf("%lld",b+i);
min = b[0];
for(i=0;i<k;i++) if(min>b[i]) min = b[i];
//printf("zac\n");
//a[0] = 1;
//s[0] = obsah[1];
j = 1;
l = 0;
while(1)
{
//printf("%lld =j\n",j);
a[l] = j;
s[l] = obsah(j);
l++;
if(j>min) break;
j = next(j);
}
for(m=l-1;m>=0;m--)
{
v[m] = s[m];
i = 2;
h = 1;
while(i*a[m] <= min)
{
while(a[m]*i >= a[h+1]) h++;
// printf("%lld=m %lld=i %lld=h\n",m,i,h);
I = (a[h+1]-1)/a[m];
g = (I-i+1);
// printf("%lld=m %lld=i %lld=h %lld=I %lld=g\n",m,i,h,I,g);
// return 0;
v[m] = (v[m] - v[h]*g)%P;
i=I+1;
}
v[m] = (v[m]+P)%P;
}
//for(i=0;i<l;i++) printf("%lld: %lld %lld -> %lld\n", i, a[i], s[i], v[i]);
r = 0;
i = 1;
h = 0;
while(i <= min)
{
// printf("...%lld=i %lld=h\n",i,h);
while(i >= a[h+1])
{
h++;
// printf("kkk\n");
}
I = a[h+1]-1;
g = (I-i+1)*(I+i)/2;
// printf("....%lld=m %lld=i %lld=h %lld=I %lld=g\n",m,i,h,I,g);
// return 0;
r = (r + v[h]*g)%P;
i=I+1;
}
printf("%lld\n",r);
}
return 0;
}
2)
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define MOD 1000000007 #define MAX 1001 int N, M,i,j,nPieces = 4; int pieces[] = {1, 2, 3, 4}; long long RowComb[MAX],ColumnComb[MAX],ColumnCombWithNoHoles[MAX]; void logic() { scanf("%d %d",&N,&M); memset(RowComb, 0, sizeof(RowComb)); RowComb[0] = 1; for (i = 1; i <= M; i++) { for (j = 0; j < nPieces; j++) { if (i - pieces[j] >= 0) RowComb[i] = (RowComb[i]+RowComb[i - pieces[j]]) % MOD; } } for (i = 1; i <= M; i++) { long long res = 1; for (j = 1; j <= N; j++) { res = (res *RowComb[i]) % MOD; } ColumnComb[i] = res; } ColumnCombWithNoHoles[1] = ColumnComb[1]; for (i = 2; i <= M; i++) { ColumnCombWithNoHoles[i] = ColumnComb[i]; for (j = 1; j < i; j++) { ColumnCombWithNoHoles[i] = (MOD + ColumnCombWithNoHoles[i]-(ColumnCombWithNoHoles[j] * ColumnComb[i - j]) % MOD) % MOD; } } printf("%lld\n",ColumnCombWithNoHoles[M]); } int main() { int T; scanf("%d",&T); while(T--) logic(); return 0; }3)#include <stdio.h> long long a[300][300],s[300][300],i,j,k,l,m,n,p[20000],v, b[300][300], zas[500][2]; void obdlzdnik(long long xx, long long yy, long long dx, long long dy) { //printf("%lld: %lld %lld %lld %lld - > %lld\n", p[k], xx, yy, dx, dy, dx*dy); if(dx*dy > v) v = dx*dy; return ; } void makaj() { long long ii,jj,kk,ll; //printf("%lld\n",p[k]); for(jj=0;jj<m;jj++) if(a[0][jj] ==0) b[0][jj] = 1; else b[0][jj] = 0; for(ii=1;ii<n;ii++) for(jj=0;jj<m;jj++) if(a[ii][jj] == 0) b[ii][jj] = b[ii-1][jj] + 1; else b[ii][jj] = 0; for(ii=0;ii<n;ii++) b[ii][m] = 0; //printf("tui\n"); for(ii=0;ii<n;ii++) { zas[0][0] = 0; zas[0][1] = -1; ll = 0; for(jj=0;jj<=m;jj++) { while(b[ii][jj] < zas[ll][0]) { obdlzdnik(ii - zas[ll][0] + 1, zas[ll][1], zas[ll][0], jj - zas[ll][1]); ll--; } if(zas[ll][0] < b[ii][jj]) { ll++; zas[ll][0] = b[ii][jj]; zas[ll][1] = jj; } } } return; } int main() { for(i=2;i<20000;i++) if(p[i]==0) for(j=i;j<=20000;j+=i) p[j] = i; scanf("%lld %lld", &n, &m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%lld",&(s[i][j])); v = 0; k = 2; //printf("tu\n"); while(k<=10000) { if(p[k] != k) {k++; continue;} for(i=0;i<n;i++) for(j=0;j<m;j++) a[i][j] = s[i][j] % p[k]; makaj(); k++; } printf("%lld\n",v); return 0; }

Comments :
Post a Comment