Cod sursa(job #3173312)

Utilizator richardbaczur1Baczur Richard richardbaczur1 Data 22 noiembrie 2023 15:26:38
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <bitset>

#define MOD 9973
#define NMAX 1000005

int t, p[NMAX], k;
long long n;
std::bitset<NMAX> ciur;

void func_ciur() {
    for (int i = 2; i <= NMAX; ++i) {
        if (!ciur[i]) {
            p[k++] = i;
            for (int j = i + i; j <= NMAX; j += i) {
                ciur[j] = 1;
            }
        }
    }
}

inline long pow(int x, int n) {
    int ret = 1;
    
    x %= MOD;
    
    for(; n; n >>= 1) {
		if(n & 1) {
			ret *= x;
			ret %= MOD;
		}

		x *= x;
		x %= MOD;
	}
	
	return ret;
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    
    scanf("%d", &t);
    func_ciur();
    while (t--) {
        scanf("%lld", &n);
        
        int cnt = 1, sum = 1;
        for (int i = 0; i < k && 1LL * p[i] * p[i] <= n; ++i) {
            if (n % p[i]) continue;
            
            int cnt_p = 0;
            while (n % p[i] == 0) {
                n /= p[i];
                ++cnt_p;
            }
            cnt *= (cnt_p + 1);
            
            int sum_p = (pow(p[i], cnt_p + 1) - 1) % MOD;
            int inv_sum_p = pow(p[i] - 1, MOD - 2) % MOD;
            
            sum = (((sum * sum_p) % MOD) * inv_sum_p) % MOD;
        }
        
        if (n > 1) {
            cnt *= 2;
            sum = (1LL * sum * (n + 1)) % MOD;
        }
        
        printf("%d %d\n", cnt, sum);
    }
    
    fclose(stdin);
    fclose(stdout);

    return 0;
}