根据小学数学知识,我们知道一个正整数x是3的倍数的条件是x每一位加起来的和是3的倍数。反之,如果一个数每一位加起来是3的倍数,则这个数肯定是3的倍数。
根据基本的数学知识,我们能够知道上述规律的证明方式:
(a0+a1∗101+a2∗102+......+an∗10n)mod9
(
a
0
+
a
1
∗
10
1
+
a
2
∗
10
2
+
.
.
.
.
.
.
+
a
n
∗
10
n
)
m
o
d
9
=(a0+a1+a2+......+an)mod9
=
(
a
0
+
a
1
+
a
2
+
.
.
.
.
.
.
+
a
n
)
m
o
d
9
+(101−1+102−1+......+10n−1)mod9
+
(
10
1
−
1
+
10
2
−
1
+
.
.
.
.
.
.
+
10
n
−
1
)
m
o
d
9
=(a0+a1+a2+......+an)mod9
=
(
a
0
+
a
1
+
a
2
+
.
.
.
.
.
.
+
a
n
)
m
o
d
9
所以我们可以得到上述的两个结论。
然后推广到进制为P:
即我们需要使得 PmodB=1 P m o d B = 1 ,那么就能够得到与上面证明3和9类似的式子,所以我们要找的B就是(P-1)的因式 (P>2)
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int t,p;
scanf("%d",&t);
while(t--)
{
scanf("%d",&p);
int sum=0;
float temp=sqrt(p-1);
for(int i=1;i<=temp;i++)
if((p-1)%i==0)
{
sum++;
sum+=(i!=temp);
}
printf("%d\n",sum);
}
return 0;
}