#include <bits/stdc++.h> using namespace std; #define FOR(i, x) for( int i = 1; i <=x; i++ ) #define REP(i, x) for( int i = 0; i < x; i++ ) #define MP make_pair #define ST first #define ND second #define PB push_back #define LL long long typedef pair<int, int> PI; typedef vector<PI> VPI; VPI dzielniki; LL wynik = 0; int s; int n; int licz_dzielniki(int k){ // większe od 1 i mniejsze od k/2 if( k <= 2 ) return 0; int wynik = 1; int kk = k; for( int i = 2; i*i <= k; i++ ){ if (k % i == 0){ int cnt = 0; while( k % i == 0 ){ k /= i; cnt++; } wynik *= (cnt+1); } } if( k > 1 ) wynik *= 2; if( kk % 2 == 0 ) wynik--; wynik -= 2; return wynik; } void znajdz_dzielniki(int n){ for( int i = 2; i*i <= n; i++ ){ if( n % i == 0 ){ int cnt = 0; while( n % i == 0 ){ n /= i; cnt++; } dzielniki.PB(MP(i, cnt)); } } if( n > 1 ) dzielniki.PB(MP(n, 1)); } void licz_wynik (int i = 0, int akt_wynik = 1){ if( i == dzielniki.size() ){ wynik += licz_dzielniki(n/akt_wynik - 1); return; } REP(j, dzielniki[i].ND+1){ licz_wynik (i+1, akt_wynik); akt_wynik *= dzielniki[i].ST; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; znajdz_dzielniki(n); licz_wynik(); cout << wynik << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <bits/stdc++.h> using namespace std; #define FOR(i, x) for( int i = 1; i <=x; i++ ) #define REP(i, x) for( int i = 0; i < x; i++ ) #define MP make_pair #define ST first #define ND second #define PB push_back #define LL long long typedef pair<int, int> PI; typedef vector<PI> VPI; VPI dzielniki; LL wynik = 0; int s; int n; int licz_dzielniki(int k){ // większe od 1 i mniejsze od k/2 if( k <= 2 ) return 0; int wynik = 1; int kk = k; for( int i = 2; i*i <= k; i++ ){ if (k % i == 0){ int cnt = 0; while( k % i == 0 ){ k /= i; cnt++; } wynik *= (cnt+1); } } if( k > 1 ) wynik *= 2; if( kk % 2 == 0 ) wynik--; wynik -= 2; return wynik; } void znajdz_dzielniki(int n){ for( int i = 2; i*i <= n; i++ ){ if( n % i == 0 ){ int cnt = 0; while( n % i == 0 ){ n /= i; cnt++; } dzielniki.PB(MP(i, cnt)); } } if( n > 1 ) dzielniki.PB(MP(n, 1)); } void licz_wynik (int i = 0, int akt_wynik = 1){ if( i == dzielniki.size() ){ wynik += licz_dzielniki(n/akt_wynik - 1); return; } REP(j, dzielniki[i].ND+1){ licz_wynik (i+1, akt_wynik); akt_wynik *= dzielniki[i].ST; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; znajdz_dzielniki(n); licz_wynik(); cout << wynik << endl; return 0; } |