程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Again Prime? No Time.(uva10870+數論),time.uva10870

Again Prime? No Time.(uva10870+數論),time.uva10870

編輯:C++入門知識

Again Prime? No Time.(uva10870+數論),time.uva10870


Again Prime? No time.
Input: standard input
Output: standard output
Time Limit: 1 second


The problem statement is very easy. Given a number n you have to determine the largest power of m, not necessarily prime, that divides n!.

 

Input

 

The input file consists of several test cases. The first line in the file is the number of cases to handle. The following lines are the cases each of which contains two integers m (1<m<5000) and n (0<n<10000). The integers are separated by an space. There will be no invalid cases given and there are not more that500 test cases.

Output

 

For each case in the input, print the case number and result in separate lines. The result is either an integer if m divides n! or a line "Impossible to divide" (without the quotes). Check the sample input and output format.

 

Sample Input

2
2 10
2 100

Sample Output

Case 1:
8
Case 2:
97

 

 

題意:求N!%M^k==0;最大的k;

思路:先算M的質因子m,並保存質因子的個數,從N開始遞減到N/m,計算每個質因子在N!中出現的次數,取最小。

 

一開始我的思路是取最大的質因子,然後發現錯了,然後想是質因子*個數最大的那個,然後想了下40,100就不對了。所以就把所有的質因子都算了一次。(本來以為會超時。。。結果142ms過。o(︶︿︶)o 唉)

 

轉載請注明出處:尋找&星空の孩子

題目連接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=77956#problem/E

 

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define LL long long
 4 /*
 5 bool prime(int x)
 6 {
 7     for(int i=2;i*i<=x;i++)
 8     {
 9         if(!(x%i)) return 0;
10     }
11     return 1;
12 }*/
13 LL a[10005];
14 inline void Maxprime(LL x)
15 {
16     LL t=1,k=0;
17     for(LL i=2; i<=x; i++)
18     {
19         while(x%i==0)
20         {
21             t=i;
22             a[i]++;
23             x/=i;
24         }
25     }
26     if(t==1)
27     {
28         a[x]=1;
29     }
30 }
31 inline LL Ssum(LL x)
32 {
33     return (x*(x+1))/2;
34 }
35 LL Sumprime(LL x,LL mod)
36 {
37     LL t=0;
38     while(x)
39     {
40         if(x%mod==0) t++,x/=mod;
41         else return t;
42     }
43     return 0;
44 }
45 
46 int main()
47 {
48     LL n,m,T,caseT=1;
49     scanf("%lld",&T);
50     while(caseT<=T)
51     {
52         memset(a,0,sizeof(a));
53         //  memset(b,0,sizeof(b));
54         scanf("%lld%lld",&m,&n);
55         LL mod;
56         Maxprime(m);
57         /*        if(mod!=m)
58                 {
59                     LL tt=0;
60                     for(LL i=2;i<n;i++)
61                     {
62                         if(tt<i*a[i])
63                         {
64                             tt=i*a[i];
65                             mod=i;
66                         }
67                     }
68                 }*/
69 //       printf("mod=%d\n",mod);
70 
71         LL  sum,minsum=9999999999;
72         for(LL j=2; j<=m; j++)
73         {
74 
75             if(!a[j]) continue;
76             sum=0;
77             for(LL i=n; i>n/j; i--)
78             {
79                 LL tmp=Sumprime(i,j);
80                 if(tmp) sum+=Ssum(tmp);
81             }
82             if(minsum>sum/a[j]) minsum=sum/a[j];
83         }
84         printf("Case %lld:\n",caseT++);
85         if(!sum) printf("Impossible to divide\n");
86         else printf("%lld\n",minsum);
87     }
88     return 0;
89 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved