小C的倍數問題
題意:
根據小學數學的知識,我們知道一個正整數x是3的倍數的條件是x每一位加起來的和是3的倍數。反之,如果一個數每一位加起來是3的倍數,則這個數肯定是3的倍數。
現在給定進制P,求有多少個B滿足P進制下,一個正整數是B的倍數的充分必要條件是每一位加起來的和是B的倍數。數據範圍:
第一行一個正整數T表示數據組數(1<=T<=20)。
接下來T行,每行一個正整數P(2 < P < 1e9),表示一組詢問。思路:
先理解一下爲什麼一個數各個數位上的和是3的倍數那這個數就是3倍數:
先看兩位數字的,如數碼ab組合
a+b爲3的倍數
那麼10*a+b=9a+(a+b)
9a能被3整除,a+b能被3整除,所以10*a+b能被3整除
再看三位數字的,如數碼abc組合
a+b+c爲3的倍數
那麼100*a+10*b+c=99a+9b+(a+b+c)
99a,9b,(a+b+c)都能被3整除,所以100*a+10*b+c能被3整除
實際上,對於任何一個自然數a(1)a(2)a(3)a(4)....a(n)
如果a(1)+a(2)+a(3)+...+a(n)爲3的倍數
那麼
a(1)*10^(n-1)+a(2)*10^(n-2)+....+a(n-1)*10+a(n)
=a(1)*[10^(n-1)-1]+a(2)*[10^(n-2)-1]+...+a(n-1)*9+[a(1)+a(2)+...+a(n)]
中間的每一項.都能被3整除
所以:
一個數各個數位上的和是3的倍數那這個數就是3倍數 (轉自:小廣廣---C先生)
在P進制,能出現的數字爲1.....P-1,而B的各位之和加起來要是B的倍數,打個表發現,B是不會超過P的的。
假設一個數爲 : p 進制下的 a1a2a3 % B == 0,那麼以下倆個等式一定成立:
1)a1 * p ^ 2 + a2 * p ^ 1 + a3 * p ^ 0 = sum % B == 0,
2)a1 + a2 + a3 = ans % B == 0
所以滿足條件的 B 的個數爲 p - 1 的因子數,只要枚舉p-1的因子數就可以了。
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int num(int n)
{
int cnt=2;
for(int i=2; i<=sqrt(n); i++)
{
if(n%i==0)
{
if(i==sqrt(n) && n/i==i)
{
cnt++;
}
else cnt+=2;
}
}
return cnt;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==1) printf("1\n");
else printf("%d\n",num(n-1));
}
return 0;
}