1. 程式人生 > >hdu 6108 小C的倍數問題

hdu 6108 小C的倍數問題

con ios ted sca clu miss tex main cst

小C的倍數問題

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


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進制,設一個數為a1a2a3,若a1a2a3%B==0可以表達成(a1*p^2+a2*p+a3)%B==0----------1式

並且按題意,(a1+a2+a3)%B==0---------2式 設p=k*B+x,代入1式,並且與2式比較,待定系數求解得x==1,也就是說p-1=k*B,那麽B一定p-1的因子,找到(p-1)所有的因子即是所求。 AC代碼:
#define _CRT_SECURE_NO_DEPRECATE
#include
<iostream> #include<stdio.h> #include<algorithm> #include<queue> #include<set> #include<vector> #include<cstring> #include<string> #include<cmath> using namespace std; vector<int>divisor(int n) { vector<int>res; for (int i = 1
; i*i < n;i++) { if (n%i == 0) { res.push_back(i); if (i != n / i)res.push_back(n / i); } } return res; } int p; int main() { int t; scanf("%d",&t); while (t--) { scanf("%d",&p); vector<int>vec = divisor(p - 1); printf("%d\n",vec.size()); } return 0; }

hdu 6108 小C的倍數問題