std::vector<std::vector<int>> primeFactor(int n, const std::set<int>& primes) { std::vector<std::vector<int>> facs(n+1); for (auto p:primes) { for(int i = 2*p; i <= n ; i += p) facs[i].emplace_back(p); } std::function<void(int,int,int,const std::vector<int>&,std::vector<int>&)> tranverse = [&tranverse](int l,int i,int m,const std::vector<int>& f, std::vector<int>& lf) { if(l == 0) { lf.emplace_back(m); return ; } else { for(int j = i+1 ; j <= f.size() - l ; ++ j) tranverse(l-1,j,m*f[j],f,lf); } }; long whole_count = 0; for (int i = 2 ; i <= n ; ++ i) { int count = i-1; int t = -1; for(int l = 1 ; l <= facs[i].size() ; ++ l) { std::vector<int> lf; tranverse(l,-1,1,facs[i],lf); for(auto f:lf) count += t*(i/f-1); t = -t; } whole_count+=count; } std::cout<<whole_count<<std::endl; return facs; }
char *change(int number, int base) { char *form; form = (char *)malloc(20 * sizeof(char)); int i = 0; do { int c; if(number % base < 10) form[i++] = number % base + '0'; else form[i++] = number % base - 10 + 'A'; } while(number /= base); form[i] = '\0'; tranverse(form); return form; }