#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1e6+5;
/*
唯一分解定理
现在给定进制P,求有多少个B满足P进制下,
一个正整数是B的倍数的充分必要条件是每一位加起来的和是B的倍数。
p进制时,x=a0(p^0)+a1(p^1)+...+an(p^n)
x%B==0 =>(a0%B+a1%B*p%B+...an%B*(p^n)%B)%B==0
(a0+a1+...+an)%B==0 =>(a0%B+a1%B+...+an%B)%B==0;
如果 x%B==(a0+a1+...+an)%B,那么p%B==1
=>B为(p-1)因子个数
*/
int n;
int a,b;
int prime[maxn];
bool is_prime[maxn];
int p;
void sieve(int n)
{
p=0;
for(int i=0; i<n; i++) is_prime[i]=1;
is_prime[0]=is_prime[1]=0;
for(int i=2; i<n; i++)
{
if(is_prime[i])
{
prime[p++]=i;
for(int j=2*i; j<n; j+=i)
{
is_prime[j]=0;
}
}
}
}
int solve(int a)
{
int cnt;
int ans=1;
int t=a;
for(int i=0; i<p&&prime[i]*prime[i]<=t; i++)
{
if(t%prime[i]==0)
{
cnt=0;
while(t%prime[i]==0)
{
t/=prime[i];
cnt++;
}
ans=ans*(cnt+1);
}
}
if(t>1)
{
ans=ans*(1+1);
}
return ans;
}
int main()
{
int t;
sieve(maxn);
scanf("%d",&t);
int p;
while(t--)
{
scanf("%d",&p);
int cnt=solve(p-1);
printf("%d\n",cnt);
}
return 0;
}
HDU6108 小C的倍数问题(进制+唯一分解定理)
最新推荐文章于 2018-12-20 17:55:54 发布