题目链接:http://121.249.217.157/JudgeOnline/problem.php?id=1060
题解:从(n-1)的因子里从大到小枚举。(用了两天推的公式,最后证明不对,可是又不知道错在哪,求指教。公式是:(n-1)%x==0&&(n-1+x)%(x^x)==0&&((n-1)/x+(n-1+x)/(x^x))%x==0)(在n=253的时候结果就不一样了。)
借鉴代码:
#include<stdio.h>
int
main()
{
int
n,m,i,j,k,ans;
scanf
(
"%d"
,&n);
while
(n!=-1)
{
i=0;ans=0;
while
((ans==0)&&(i<n))
{
i++;
m=n;
if
((m-1)%i==0)
{
j=(m-1)/i;
k=j;
while
((k>0)&&(m-1)%j==0)
{
k--;
m=m-1-(m-1)/j;
}
if
((k==0)&&(m%j==0))
{
ans=j;
}
}
}
if
(ans>1)
printf
(
"%d coconuts, %d people and 1 monkey\n"
,n,ans);
else
printf
(
"%d coconuts, no solution\n"
,n);
scanf
(
"%d"
,&n);
}
}
我写的代码:
#include<iostream>
using namespace std;
int main()
{
int a[11];
int i,j;
int mid;
for(i=2;i<=9;i++)
{
mid=1;
for(j=1;j<=i;j++) mid*=i;
a[i]=mid;
}
int n;
int flag;
int mid1,mid2;
int mid3;
while(cin>>n&&n!=-1)
{
flag=0;
for(i=9;i>=2;i--)
{
mid3=n-1;
if(mid3%i!=0) continue;
mid2=n+i-1;
if(mid2%a[i]!=0) continue;
mid1=mid3/i;
int mid4=mid2/a[i];
if( (mid1 + mid4 ) % i ==0)
{
flag=1;
break;
}
}
cout<<n<<" coconuts, ";
if(flag) cout<<i<<" people and 1 monkey"<<endl;
else cout<<"no solution"<<endl;
}
}