Pagini recente » Cod sursa (job #426836) | Cod sursa (job #1758444) | Cod sursa (job #2322492) | Cod sursa (job #2784600) | Cod sursa (job #3217170)
#include <fstream>
#include <iostream>
#include <vector>
#define int long long
#define MOD 1000000007
#define VMAX 1000007
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int a, b;
int ans;
bool fCiur[VMAX];
vector<int> prime;
int d;
int explog(int, int);
void ciur();
signed main()
{
ciur();
fin >>a>>b;
d = 2; ans = 1;
int ind = 0;
while (d*d <= a)
{
int counter = 0;
while (a%d == 0)
a /= d, counter ++;
if (counter == 0)
{
d = prime[++ind];
continue;
}
counter *= b;
if (d % MOD == 1)
ans = (ans * ((counter+1)%MOD)) % MOD;
else
ans = (ans * ((explog(d, counter+1)-1+MOD) % MOD * explog(d-1, MOD-2) % MOD)) % MOD;
d = prime[++ind];
}
if (a > 1)
if (a%MOD == 1)
ans = (ans * ((b+1)%MOD)) % MOD;
else
ans = (ans * (((explog(a, b+1)-1+MOD) % MOD * explog(a-1, MOD-2))% MOD)) % MOD;
fout <<ans<<'\n';
fout.close();
return 0;
}
void ciur()
{
int i, j;
fCiur[0] = fCiur[1] = 1;
for (i = 2; i*i < VMAX; ++i)
{
if (!fCiur[i])
for (j = i*i; j < VMAX; j += i)
fCiur[j] = 1;
}
for (i = 2; i < VMAX; ++i)
if (!fCiur[i])
prime.push_back(i);
}
int explog(int n, int k)
{
if (!k)
return 1;
int aux = explog(n, k/2);
return (k%2? aux*aux%MOD*n%MOD: aux*aux%MOD);
}