#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; } |
English