#include <bits/stdc++.h>   const double pi = acos(-1.0);   const int INF = 0x3f3f3f3f;   const double eps = 1e-8;   const int MAXN = 1e3 + 10;   const int mod = 1e9 + 7;   const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};   const int seed = 131;   int cases = 0;   char str[MAXN];   int mp[MAXN], col[MAXN], cnt[30], vis[MAXN], need[MAXN], ans[MAXN];   std::vector<int> primes, fac[MAXN], f[MAXN];   std::priority_queue<std::pair<int, int> > num;   std::vector<std::pair<int, int> > number_of_need;   void init() {     for (int i = 2; i < MAXN; i++)       if (!vis[i])         for (int j = i; j < MAXN; j += i) {           fac[j].push_back(i);           if (j != i) vis[j] = 1;         }     for (int i = 2; i < MAXN; i++)       if (!vis[i]) primes.push_back(i);   }   int find(int n) { return col[n] = n == col[n] ? n : find(col[n]); }   int main() {     init();     scanf( %s , str);     int len = strlen(str);     for (int i = 0; i < len; i++) cnt[str[i] -  a ]++;     for (int i = 0; i < 26; i++)       if (cnt[i]) num.push({cnt[i], i});     for (int i = 2; i <= len; i++) {       if ((int)fac[i].size() == 1)         col[i] = i;       else {         int v = find(fac[i][0]);         for (int j = 1; j < (int)fac[i].size(); j++) col[fac[i][j]] = v;       }     }     for (int pri : primes) {       if (pri > len) break;       find(pri);     }     for (int i = 2; i <= len; i++) f[col[fac[i][0]]].push_back(i);     for (int i = 2; i <= len; i++)       if (!f[i].empty()) {         if (num.empty() || num.top().first < (int)f[i].size()) {           puts( NO );           return 0;         }         std::pair<int, int> u = num.top();         num.pop();         for (int j : f[i]) str[j] = char(u.second +  a );         if (u.first - (int)f[i].size() > 0)           num.push({u.first - (int)f[i].size(), u.second});       }     if (num.empty()) {       puts( NO );       return 0;     }     str[1] = char(num.top().second +  a );     puts( YES );     printf( %s n , str + 1);     return 0;   }   