hdu6108小C的倍數問題(數論)

小C的倍數問題

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 462    Accepted Submission(s): 264


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
 

Source
    
   x在任意進制下可以有如下的轉換:
   x = a*p^3+b*p^2+c*p^1+d = a*(p^3-1)+b*(p^2-1)+c*(p^1-1)+a+b+c+d
     由於a*(p^3-1)+b*(p^2-1)+c*(p^1-1)是x-1的倍數,那麼公式就變成了a+b+c+d是x-1的倍數,也就是求x-1的因子個數
     優化:取根號遍歷,每次ans+2,ans初始爲1+其本身=2,如果完全平方數爲其本身,那麼ans-1
     
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
    int t;
    int n;
    scanf("%d",&t);
    while(t--)
    {
        int ans=2;///每個數至少兩個因子,一個1,一個自己本身
        scanf("%d",&n);
        for(int i=2;i*i<=n-1;i++)///優化
        {
            if((n-1)%i==0)
            ans+=2;
        }
        int s=sqrt(n-1);
        if(s*s==n-1)///如果n本身是完全平方數,就要把ans--
        ans--;
        cout<<ans<<endl;
    }
    return 0;
}

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