數學規律題 - 百度之星1001 小C的倍數問題

小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

以上兩個式子同時成立的條件是 : p % B == 1
所以滿足條件的 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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章