題目來源
小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;
}