hdu 6108 小C的倍數問題
阿新 • • 發佈:2017-08-12
con ios ted sca clu miss tex main cst
現在給定進制P,求有多少個B滿足P進制下,一個正整數是B的倍數的充分必要條件是每一位加起來的和是B的倍數。
接下來T行,每行一個正整數P(2 < P < 1e9),表示一組詢問。
Output
對於每組數據輸出一行,每一行一個數表示答案。
小C的倍數問題
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 277 Accepted Submission(s):
137
現在給定進制P,求有多少個B滿足P進制下,一個正整數是B的倍數的充分必要條件是每一位加起來的和是B的倍數。
Input 第一行一個正整數T表示數據組數(1<=T<=20)。
接下來T行,每行一個正整數P(2 < P < 1e9),表示一組詢問。
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的倍數問題