Tina Town 是一个善良友好的地方,这里的每一个人都互相关心。 Tina有一个球,它的名字叫zball。zball很神奇,它会每天变大。在第一天的时候,它会变大1倍。在第二天的时候,它会变大2倍。在第n天的时候,它会变大n倍。 zball原来的体积是1。Tina想知道,zball在第n−1天时的体积对n取模是多大呢? Tina是一个蠢蠢的女孩子,当然不会算啦,所以她请你帮她算出这个答案呢。
第一行一个正整数T,表示数据组数 接下来T行,每行一个正整数n,意义如题面所述 T≤105,2≤n≤109
对于每组数据,输出一个正整数,表示答案。
2 3 10
2 0
刚看到题,就感觉是有规律的。然后直接打表,找到了规律,n=(1,--)
1 1 2 2 4 0 6 0 0 0 10 0 12 0 0 0 16 0 18 0 0 0 22 0 0 0 0 0 28 0 30 0 0 0 0 0 36 0 0 0 40 0 42 0 0 0 46 0 0 0 0 0 52 0 0 0 0 0 58 0 60 0 0 0 0 0 66 0 0 0 70 0 72 0 0 0 0 0 78 0 0 0 82 0 0 0 0 0 88 0 0 0 0 0 0 0 96 0 0 0 100 0 102 0 0 0 106 0 108 0 0 0 112 0 0 0 0 0 0 0 0 0 0 0 0 0 126 0 0 0 130 0 0 0 0 0 136 0 138 0 0 0 0 0 0 0 0 0 148 0 150 0 0 0 0 0 156 0 0 0 0 0 162 0 0 0 166 0 0 0 0 0 172 0 0 0 0 0 178 0 180 0 0 0 0 0 0 0 0 0 190 0 192 0 0 0 196 0 198 0 0 0 0 0 0 0 0 0 0 0 210 0 0 0 0 0 0 0 0 0 0 0 222 0 0 0 226 0 228 0 0 0 232 0 0 0 0 0 238 0 240 0 0 0 0 0 0 0 0 0 250 0 0 0 0 0 256 0 0 0 0 0 262 0 0 0 0 0 268 0 270 0 0 0 0 0 276 0 0 0 280 0 282 0 0 0 0 0 0 0 0 0 292 0 0 0 0 0 0 0 0 0 0 0 0 0 306 0 0 0 310 0 312 0 0 0 316 0 0 0 0 0 0 0 0 0 0 0 0 0 330 0 0 0 0 0 336 0 0 0 0 0 0 0 0 0 346 0 348 0 0 0 352 0 0 0 0 0 358 0 0 0 0 0 0 0 366 0 0 0 0 0 372 0 0 0 0 0 378 0 0 0 382 0 0 0 0 0 388 0 0 0 0 0 0 0 396 0 0 0 400 0 0 0 0 0 0 0 408 0 0 0 0 0 0 0 0 0 418 0 420 0 0 0 0 0 0 0 0 0 430 0 432 0 0 0 0 0 438 0 0 0 442 0 0 0 0 0 448 0 0 0 0 0 0 0 456 0 0 0 460 0 462 0 0 0 466 0 0 0 0 0 0 0 0 0 0 0 478 0 0 0 0 0 0 0 486 0 0 0 490 0 0 0 0 0 0 0 498 0 0 0 502 0 0 0 0 0 508 0 0 0 0 0 0 0 0 0 0 0 520 0 522 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 540 0 0 0 0 0 546 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 562 0 0 0 0 0 568 0 570 0 0 0 0 0 576 0 0 0 0 0 0 0 0 0 586 0 0 0 0 0 592 0 0 0 0 0 598前几个特殊处理下,然后是个n为素数,则输出素数-1,若不是素数,则为0
代码:
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <cmath> using namespace std; //借鉴了荣耀大神的快速判断素数 bool prime (long long num) { if (num == 2 || num == 3 || num == 5) return true; if (num % 2 == 0 || num % 3 == 0 || num % 5 == 0 || num == 1) return false; long long c = 7; int maxc = (int)(sqrt (num)); while (c <= maxc) { if (num % c == 0) return false; c += 4; if (num % c == 0) return false; c += 2; if (num % c == 0) return false; c += 4; if (num % c == 0) return false; c += 2; if (num % c == 0) return false; c += 4; if (num % c == 0) return false; c += 6; if (num % c == 0) return false; c += 2; if (num % c == 0) return false; c += 6; } return true; } int main() { int a[10]={0,1,1,2,2,4}; int T; long long n; scanf("%d",&T); while(T--) { scanf("%lld",&n); if(n<5)printf("%d\n",a[n]); else { if(prime(n))printf("%lld\n",n-1); else printf("0\n"); } } return 0; }