[关闭]
@LinKArftc 2015-10-21T21:03:44.000000Z 字数 1859 阅读 1162

找规律

其他


HDU2441

规律:只要这个数的因子中存在平方数,那么这个数就不在数组里
kuangbin的大数模板敲起来也不是很麻烦

  1. #define DLEN 4
  2. #define MAXN 9999
  3. const int maxn = 66000;
  4. int num[maxn];
  5. int prime[maxn];
  6. int cnt;
  7. char str[1000];
  8. void init() {
  9. cnt = 0;
  10. memset(num, -1, sizeof(num));
  11. for (int i = 2; i <= (maxn >> 1); i ++) {
  12. for (int j = (i << 2); j <= maxn; j += i) num[j] = 0;
  13. }
  14. for (int i = 2; i <= maxn; i ++) {
  15. if (num[i]) prime[cnt ++] = i;
  16. }
  17. }
  18. class BigNum {
  19. private:
  20. int a[1000];
  21. int len;
  22. public:
  23. BigNum() { len = 1; memset(a, 0, sizeof(a)); }
  24. BigNum(const char*);
  25. BigNum(const BigNum &);
  26. BigNum &operator=(const BigNum &);
  27. BigNum operator+(const BigNum &) const;
  28. BigNum operator-(const BigNum &) const;
  29. BigNum operator*(const BigNum &) const;
  30. BigNum operator/(const int &) const;
  31. int operator%(const int &) const;
  32. void print();
  33. };
  34. BigNum::BigNum(const char*s) {
  35. int t, k, index, L, i;
  36. memset(a, 0, sizeof(a));
  37. L = strlen(s);
  38. len = L / DLEN;
  39. if (L % DLEN) len ++;
  40. index = 0;
  41. for (i = L - 1; i >= 0; i -= DLEN) {
  42. t = 0;
  43. k = i - DLEN + 1;
  44. if (k < 0) k = 0;
  45. for (int j = k; j <= i; j ++) t = t * 10 + s[j] - '0';
  46. a[index ++] = t;
  47. }
  48. }
  49. BigNum::BigNum(const BigNum &T):len(T.len) {
  50. int i;
  51. memset(a, 0, sizeof(a));
  52. for (i = 0; i < len; i ++) a[i] = T.a[i];
  53. }
  54. BigNum & BigNum::operator=(const BigNum &n) {
  55. int i;
  56. len = n.len;
  57. memset(a, 0, sizeof(a));
  58. for (i = 0; i < len; i ++) a[i] = n.a[i];
  59. return *this;
  60. }
  61. BigNum BigNum::operator/(const int &b) const {
  62. BigNum ret;
  63. int i, down = 0;
  64. for (int i = len - 1; i >= 0; i --) {
  65. ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
  66. down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
  67. }
  68. ret.len = len;
  69. while (ret.a[ret.len - 1] == 0 && ret.len > 1) ret.len --;
  70. return ret;
  71. }
  72. int BigNum::operator%(const int &b) const {
  73. int i, d = 0;
  74. for (int i = len - 1; i >= 0; i --) d = ((d * (MAXN + 1)) % b + a[i]) % b;
  75. return d;
  76. }
  77. void BigNum::print() {
  78. int i;
  79. printf("%d", a[len-1]);
  80. for (int i = len - 2; i >= 0; i --) printf("%04d", a[i]);
  81. printf("\n");
  82. }
  83. int main() {
  84. init();
  85. while (~scanf("%s", str)) {
  86. if (str[0] == '0') break;
  87. if (strlen(str) == 1 && str[0] == '1') {
  88. printf("no\n");
  89. continue;
  90. }
  91. BigNum n = BigNum(str);
  92. int count;
  93. for (int i = 0; i < cnt; i ++) {
  94. count = 0;
  95. BigNum tmp = n;
  96. while (tmp % prime[i] == 0) {
  97. count ++;
  98. tmp = tmp / prime[i];
  99. if (count >= 2) break;
  100. }
  101. if (count >= 2) break;
  102. }
  103. if (count >= 2) printf("no\n");
  104. else printf("yes\n");
  105. }
  106. return 0;
  107. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注