思路:
假设一个进制p,一个数n,现在我们要求一个数B,使得n的各个位上的数加起来是b的倍数,那么n为B的倍数。类似于这样的数。
我们知道n一定可以表示成系数乘以进制的形式,如:
n=a∗1+b∗p+c∗P2+d∗p3...
而且同时我们知道: a+b+c...=B 那么上个式子则可以化简为:
n=B+b∗(p−1)+c∗(p2−1)+d∗(p3−1)...
而且右边的这个式子需要模B为0,所以进一步化简为:
n=B+b∗(p−1)+c∗(p−1)∗(p+1)+d∗(p−1)∗(p+1)2...
所以我们能看出来,B如果是(p-1)的因数的话,自然有这个结论。
充分性得证,至于必要性。。还不太清楚,但是就是感觉是这样。
有哪个dalao有指教的话直接评论里告我吧,谢谢。
#include<stdio.h>
#include <iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#define eps 1e-8
typedef long long int lli;
using namespace std;
const int maxn = 1e6+10;
int fen(int n){
int ans = 1,res = 0;
for(lli i = 2;i*i <= n;i++){
while(n%i==0){
res++;
n/=i;
}
if(res != 0){
ans *= (res+1);
res = 0;
}
}
if(n != 1) ans *= 2;
return ans;
}
int main(){
int t,p;
scanf("%d",&t);
while(t--){
scanf("%d",&p);
printf("%d\n",fen(p-1));
}
return 0;
}