題目
解法:
首先寫出遞推公式f(0)=A A=nkf(i)=f(i-1)/(n-1)*n+1隨便什么方法寫出閉形式
f(n)=[(n^n)*(A+n-1)]/[(n-1)^n]-(n-1)題目中告訴f(n)的值,求n最大值
首先觀察下前面那個(gè)分式,由于
n和n-1互質(zhì),所以n^n和(n-1)^n也互質(zhì),分式結(jié)果要為一個(gè)整數(shù),
f(n)+n-1中必須含有因子n^n;換句話說(shuō),f(n)+n-1>n^n,題目中給的f(n)可以用32位整數(shù)表示,
那么n必然小于12!下面不用說(shuō)什么了,暴力吧,肯定0MS了~不過(guò)為了完美,n^n我用了二進(jìn)制快速冪~具體看代碼吧
代碼:
1 Source Code
2 Problem: 1309 User: yzhw
3 Memory: 392K Time: 0MS
4 Language: G++ Result: Accepted
5
6 Source Code
7
8 # include <cstdio>
9 using namespace std;
10 long long pow(int a,int b)
11 {
12 long long ans=1,t=a;
13 while(b)
14 {
15 if(b&1) ans*=t;
16 t*=t;
17 b>>=1;
18 }
19 return ans;
20 }
21 int main()
22 {
23 //freopen("input.txt","r",stdin);
24 int n;
25 while(scanf("%d",&n)!=EOF&&n>=0)
26 {
27 int ans=-1,i;
28 for(i=2;i<=12;i++)
29 {
30 long long t=n;
31 t+=i-1;
32 long long t1=pow(i,i),t2=pow(i-1,i);
33 if(t%t1==0)
34 {
35 t=t/t1*t2-i+1;
36 if(t>=0&&t%i==0) ans=i;
37 }
38 }
39 if(ans==-1) printf("%d coconuts, no solution\n",n);
40 else printf("%d coconuts, %d people and 1 monkey\n",n,ans);
41 }
42 return 0;
43 }
44
45