Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- char *strrev(char *str) {
- char *end = str + strlen(str) - 1;
- char *begin = str;
- while (begin < end) {
- *begin ^= *end;
- *end ^= *begin;
- *begin ^= *end;
- begin++;
- end--;
- }
- return str;
- }
- char *uint128tostr(__uint128_t n) {
- char *b = malloc(64 * sizeof(char));
- if (n == 0) {
- b[0] = '0';
- b[1] = 0;
- return b;
- }
- unsigned int i = 0;
- while (n) {
- b[i++] = n % 10 + '0';
- n /= 10;
- }
- b[i] = 0;
- return strrev(b);
- }
- __uint128_t frombase(__uint128_t num, __uint128_t radix) { /* from base 2 */
- if (radix == 2) return num;
- __uint128_t n = 1;
- __uint128_t ret = 0;
- while (num) {
- __uint128_t digit = num % 2;
- num /= 2;
- ret += digit * n;
- n *= radix;
- }
- return ret;
- }
- __uint128_t isprime(__uint128_t num) { /* returns 1 if prime, 0 if the number is 1, an factor otherwise */
- if (num == 1) return 0;
- if (num % 2 == 0) return 2;
- if (num % 3 == 0) return 3;
- if (num % 5 == 0) return 5;
- if (num % 7 == 0) return 7;
- if (num % 11 == 0) return 11;
- if (num < 11*11) return 1;
- __uint128_t i;
- for (i = 13; i*i <= num && i < 5000000; i += 2) { // just give up if you're trying numbers over 5000000 :P
- if (num % i == 0) return i;
- }
- return 1;
- }
- __uint128_t *isjamcoin(__uint128_t jamcoin) { /* returns list of divisors if is a jamcoin, NULL otherwise */
- __uint128_t *divisors = malloc(9 * sizeof(__uint128_t));
- __uint128_t i;
- for (i = 2; i <= 10; i++) {
- __uint128_t n = frombase(jamcoin, i);
- __uint128_t r = isprime(n);
- if (r > 1) {
- divisors[i-2] = r;
- } else {
- free(divisors);
- return NULL;
- }
- }
- return divisors;
- }
- void printjamcoins(unsigned int length, unsigned int num) {
- unsigned int count = 0;
- __uint128_t template = ((__uint128_t) 1 << (length-1)) + 1;
- __uint128_t i = 0;
- while (count < num) {
- __uint128_t jamcoin = template + ((__uint128_t) i << 1);
- __uint128_t *ret = isjamcoin(jamcoin);
- if (ret) {
- int j;
- for (j = length-1; j >= 0; j--) {
- printf("%d", (jamcoin & ((__uint128_t) 1 << j)) ? 1 : 0);
- }
- printf(" %s %s %s %s %s %s %s %s %s\n",
- uint128tostr(ret[0]), uint128tostr(ret[1]),
- uint128tostr(ret[2]), uint128tostr(ret[3]),
- uint128tostr(ret[4]), uint128tostr(ret[5]),
- uint128tostr(ret[6]), uint128tostr(ret[7]),
- uint128tostr(ret[8]));
- /*printf(" %lu %lu %lu %lu %lu %lu %lu %lu %lu", ret[0], ret[1], ret[2], ret[3], ret[4], ret[5], ret[6], ret[7], ret[8]);*/
- count++;
- }
- i++;
- }
- }
- int main() {
- int _, n, j;
- scanf("%d\n%d %d", &_, &n, &j);
- printf("Case #1:\n");
- printjamcoins(n, j);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement