A mad researcher was trying to get fund for his research project but it is a pity that after a year he
was able to collect 500$ only. So all his research work has gone to ashtray. The mad researcher now
wants his revenge, so he wants you to solve his unfinished research problem within a very limited time.
You will be happy to know that his research is related to Eulers phi function.
Euler’s phi (or totient) function of a positive integer n is the number of integers in {1, 2, 3, … , n}
which are relatively prime to n. This is usually denoted as ϕ(n). The table below shows the value of
phi function for first few numbers.
integer n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ϕ(n) 1 1 2 2 4 2 6 4 6 4 10 4 12 6 8 8
Given the value of n, it is very easy to find the value of ϕ(n) using the formula below:
ϕ(n) = n
∏
p|n
(1 −
1
p
) // Here p is prime
According to this formula ϕ(12) = ϕ(22 ∗ 3) = 12(1 −
1
2
)(1 −
1
3
) = 12 ∗
1
2
∗
2
3 = 4.
But your task is not quite straightforward, given the value of ϕ(n) you will have to find the minimum
possible value of n.
Input
The input file contains at most 100 lines of input. Each line contains a positive integer phin (1 ≤
phin ≤ 100000000). Input is terminated by a line where phin = 0. This line should not be processed.
Output
For each line of input produce one line of output. This line contains the serial of output followed by
two integers phin and n. The first integer is the integer taken as input and the second integer is the
minimum possible value of n, for which ϕ(n) = phin. All the input numbers will be such that for all
given input there will be a possible value of n less than 200000000.
给定 φ(n) ,求满足的最小 n ;
大暴力即可;
其实跑的还可以;
思路: φ(n) = n* ∏ ( pi-1 ) ; 对于这个式子我们可以化为 p1^n1 ( p1-1 ) p2^n2 * ( p2-1 )…….;那么我们暴力 dfs 即可解决
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#pragma GCC optimize("O3")
using namespace std;
#define maxn 20005
#define inf 0x3f3f3f3f
#define INF 0x7fffffff
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define sq(x) (x)*(x)
#define eps 1e-6
const int N = 2500005;
inline int read()
{
int x = 0, k = 1; char c = getchar();
while (c < '0' || c > '9') { if (c == '-')k = -1; c = getchar(); }
while (c >= '0' && c <= '9')x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x * k;
}
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
int prime[maxn+5];
int primeNum, vis[maxn+5], n, suit[maxn+5], suitN, res;
void getPrime(int n) {
primeNum = 0;
ms(vis);
for (int i = 2; i <=(n); i++) {
if (vis[i])continue;
prime[primeNum++] = i;
// vis[i] = 1;
for (int j = 2 * i; j <= n; j += i)vis[j] = 1;
}
}
void chose(int n) {
suitN = 0;
for (int i = 0; i < primeNum && (prime[i] - 1)*(prime[i] - 1) <= n; i++) {
if (n % (prime[i] - 1) == 0)suit[suitN++] = prime[i];
else continue;
}
}
int check(int n) {
for (int i = 0; i < primeNum && prime[i] <= sqrt(n); i++)
if (n%prime[i]==0)return 0;
for (int i = 0; i < suitN; i++)
if (suit[i] == n&&vis[i]==1)return 0;
return 1;
}
void dfs(int dep, int now, int cnt) {
if (dep == suitN) {
if (now == 1)res = min(res, cnt);
else if (check(now + 1)) {
cnt *= (now + 1); res = min(res, cnt);
}
return;
}
dfs(dep + 1, now, cnt);
if (now % (suit[dep] - 1))return;
now /= (suit[dep] - 1);
vis[dep] = 1; cnt *= suit[dep];
dfs(dep + 1, now, cnt);
while (now % (suit[dep]) == 0) {
now /= (suit[dep]); cnt *= suit[dep];
dfs(dep + 1, now, cnt);
}
vis[dep] = 0;
}
int main()
{
ios::sync_with_stdio(false);
getPrime(maxn);
int cnt = 0;
while (cin >> n && n) {
cnt++;res = inf;
chose(n); ms(vis);
dfs(0, n, 1);
cout << "Case " << cnt << ": " << n << ' ' << res << endl;
}
return 0;
}