Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int main(void)
- {
- unsigned char q[21], r[21], t[21];
- for (int base=4; base<20; base+=2)
- {
- for (int i=0; i<20; i++) q[i]=0;
- q[base]=77;
- unsigned long long ct = 0;
- while (q[base]!=78)
- {
- for (int i=0; i<base; i++) r[i]=i;
- // convert from mixed-base to factorial
- for (int i=0; i<base; i++)
- {
- t[i]=r[q[i]];
- for (int j=q[i]+1; j<base; j++) r[j-1]=r[j];
- }
- // prepare the numbers
- unsigned long long Z1=0,Z2=0,Z3=0;
- for (int i=0; i<base/2; i++)
- {
- Z1=(Z1*base)+t[i];
- Z2=(Z2*base)+t[i+base/2];
- }
- if (Z1<Z2)
- {
- // multiply
- Z3 = Z1*Z2; unsigned long long Z3u=Z3;
- unsigned long long msk = 0;
- for (int i=0; i<base; i++)
- {
- msk |= 1<<(Z3%base);
- Z3/=base;
- }
- if (msk == (1<<base)-1)
- {
- ct++;
- // printf("%d %llu %llu %llu\n", base, Z1, Z2, Z3u);
- }
- }
- // (base 4) 30*21=1230
- // and increment
- q[0]++;
- int j = 0;
- while (q[j]==(base-j) && j<base) { q[j]=0; q[1+j]++; j++; }
- }
- printf("%d %d\n", base, ct);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement