bestcoder 小C的倍數問題

題目來源
小C的倍數問題
Accepts: 1810 Submissions: 4823
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
根據小學數學的知識,我們知道一個正整數x是3的倍數的條件是x每一位加起來的和是3的倍數。反之,如果一個數每一位加起來是3的倍數,則這個數肯定是3的倍數。

現在給定進制P,求有多少個B滿足P進制下,一個正整數是B的倍數的充分必要條件是每一位加起來的和是B的倍數。

Input
第一行一個正整數T表示數據組數(1<=T<=20)。

接下來T行,每行一個正整數P(2 < P < 1e9),表示一組詢問。

Output
對於每組數據輸出一行,每一行一個數表示答案。

Sample Input
1
10
Sample Output
3

題解:題中所給的數字p太大,如果一個個算肯定會超時,所以這是一道規律題,多算幾個例子規律很容易得出。對於樣例來說,十進制滿足條件的有三個數,分別是1,3,9;滿足條件的B也不會超過P,這個題的意思不太好理解,就是對於一個P進制的數,讓你求出有多少個B滿足條件,使能被B(用十進制除就行)整除的數其各位數字之和(這裏的各位數字之和是轉化爲P進制之後的各位數字之和)也能被B整除,舉個例子,十進制中,能被3整除的數各個位上數字相加也是3的倍數,反過來也是滿足的,即各個位上數字相加是3的倍數的數也能被3整除,同樣對於十進制來說,1,9,也是滿足的。
規律:就是P-1的因子個數,我是通過打表總結出來的。

找規律代碼:

#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int sum;
int js(int s,int p)
{
    int sum=0;
    while(s!=0)
    {
        sum+=s%p;
        s/=p;
    }
    return sum;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int p;
        scanf("%d",&p);
        for(int i=1;i<=p;i++)
        {
            int flag=0;
            for(int j=1; j<=1000; j++)
            {
                if(j%i==0)
                {
                    if(js(j,p)%i!=0)
                        flag=1;
                }
                if(flag==1)
                    break;
            }
            if(flag==0)
                printf("i:%d\n",i);//滿足條件的數B輸出可總結出規律
        }
    }
    return 0;
}

AC代碼:

#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int sum;
int prime(int s)
{

        for(int i=1;i<=(int)sqrt(s);i++)
        if(s%i==0)
        {
            if(i*i!=s)
                sum+=2;
            else
                sum++;
        }
        return sum;

}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int p;
        scanf("%d",&p);
        p--;
        sum=0;
        printf("%d\n",prime(p));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章