Zball in Tina Town
Accepts: 478
Submissions: 2073
Time Limit: 3000/1500 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
问题描述
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;
}