F
|
Alternate
Task
Input: Standard Input
Output: Standard Output
|
Little Hasan loves to play number games with his friends.
One day they were playing a game where one of them will speak out a positive number
and the others have to tell the sum of its factors. The first one to say it
correctly wins. After a while they got bored and wanted to try out a different
game. Hassan then suggested about trying the reverse. That is, given a positive
number S, they have to find a number
whose factors add up to S. Realizing
that this task is tougher than the original task, Hasan came to you for
help. Luckily Hasan owns a portable
programmable device and you have decided to burn a program to this device.
Given the value of S as input to the
program, it will output a number whose sum of factors equal to S.
Input
Each
case of input will consist of a positive integer S<=1000. The last case is followed
by a value of 0.
Output
For
each case of input, there will be one line of output. It will be a positive
integer whose sum of factors is equal to S.
If there is more than one such integer, output the largest. If no such number
exists, output -1. Adhere to the
format shown in sample output.
Sample Input
Output for Sample Input
1
102 1000 0 |
Case 1: 1
Case 2: 101 Case 3: -1 |
Solution
#include <stdio.h>
typedef struct{
int s,k;
}data;
int ans[1005];
int main(){
int i,j,k,l,tmp,n,cas = 1;
data a[1001];
a[1].k = 1;
a[1].s = 1;
for( i = 2,j = 3; i <= 1000; i++,j++)
a[i].k = i,a[i].s = j;
for( i = 2; i <= 31; i++){
for( j = i*i; j < 1001; j += i){
a[j].s += i;
tmp = j/i;
if( tmp != i)
a[j].s += tmp;
}
}
for( i = 1000; i >= 1; i--){
if( a[i].s <= 1000 && ans[a[i].s] == 0)
ans[a[i].s] = a[i].k;
}
while( scanf("%d",&n) && n){
if( ans[n] )
printf("Case %d: %d\n",cas++,ans[n]);
else
printf("Case %d: -1\n",cas++);
}
return 0;
}
No comments:
Post a Comment