/*
Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).
*/
#include<stdio.h>
#include<string.h>
long long mod = 9901;
long long exp(long long a,long long b,long long c)
{
long long ans = 1;
while(b)
{
if(b&1) ans = (ans * a) % mod;
a = (a * a) % mod;
b /= 2;
}
return ans;
}
long long getsum(long long a,long long b,long long mod)
{
if(!b)return 1;
if(b&1) return ((1+exp(a,b/2+1,mod))*getsum(a,b/2,mod))%mod;
return ((1+exp(a,b/2+1,mod))*getsum(a,b/2-1,mod)+exp(a,b/2,mod))%mod;
}
int main()
{
long long a,b,i,j;
long long as[100],bs[100];
while(scanf("%I64d%I64d",&a,&b)==2)
{
int ct = 0;
for(i = 2; i * i <= a; ++ i)
if(a % i == 0){
as[ct] = i;
bs[ct] = 0;
while(a % i==0){
bs[ct]++;
a /= i;
}
ct++;
}
if(a > 1){ as[ct] = a; bs[ct++] = 1; }
long long ans = 1;
for(i = 0; i < ct ; ++ i)
ans = (ans * getsum(as[i],bs[i]*b,mod)) % mod;
printf("%I64d\n",ans);
}return 0;
}
//区间筛素数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
long long prime[100000],cnt;
char si[1000005],ans[1000005];
long long as[1000000];
void get_prime(){
int i,j;
prime[cnt++]=2;
for( i=4; i<=1000000; i+=2 ) si[i]=1;
for( i=3; i<1000000; i+=2 ){
if(!si[i]){
prime[cnt++]=i;
for( j=i*i; j<1000000&&j>0; j+=i )
si[j]=1;
}
}
}
int main(){
long long i,j,t,n,m,k;
get_prime();
while(scanf("%I64d %I64d",&m,&n)==2){
k = 0;
if( m<=2 ){ if( n>=2 ) as[k++]=2; m=3; }
memset(ans,0,sizeof(ans));
if( m%2==0 ) m++;
for( i=0; prime[i]*prime[i]<=n; i++ ){
for( j=(m/prime[i])*prime[i]; j<=n; j+=prime[i] )
if( j>=m&&j>prime[i] ) ans[j-m]=1;
}
for( i=0; i<=n-m; i++ ) if( !ans[i] )as[k++]=i+m;
if(k>1){
int x1,y1,x2,y2;
int min = 1<<21,max = 0;
for(i = 1; i < k; ++ i){
if(as[i]-as[i-1]<min){min=as[i]-as[i-1]; x1 = as[i-1]; y1 = as[i]; }
if(as[i]-as[i-1]>max){max=as[i]-as[i-1]; x2 = as[i-1]; y2 = as[i]; }
}
printf("%d,%d are closest, %d,%d are most distant.\n",x1,y1,x2,y2);
}else puts("There are no adjacent primes.");
}return 0;
}
//简单容斥 Calculation 2
#include<stdio.h>
int as[1000],ct;
long long ans;
void dfs(int x,int flag,int n,int com,int f)
{
if(x==ct||com==n) return;
long long t = (n-1) / com;
if(f){
if(flag&1) ans += (t+1)*t/2*com;
else ans -= (t+1)*t/2*com;
}
dfs(x+1,flag,n,com,0);
dfs(x+1,flag+1,n,com*as[x+1],1);
}
int main()
{
int n;
while(scanf("%d",&n)&&n){
ans = 0; ct = 0;
int k = n;
for(long long i = 2; i*i <= n; ++ i)
if(n%i==0){ as[ct++]=i; while(n%i==0)n/=i; }
if(n>1)as[ct++]=n;
for(int i = 0; i < ct; ++ i) dfs(i,1,k,as[i],1);
printf("%I64d\n",ans%1000000007);
}
return 0;
}
/*
Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you're only required to output the total number of different number pairs.Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.Yoiu can assume that a = c = 1 in all test cases.*/
#include<stdio.h>
long long phi[100005],prime[100005],as[100005];
char si[100005];
long long has[10005],cnt,ans;
void Init()
{
long long i,j,k=0;
for(i = 1; i < 100005; ++ i) phi[i] = i;
for(i = 2; i < 100005; i += 2) phi[i] /= 2;
for(i = 3; i < 100005; i += 2) if(phi[i] == i){
for(j = i; j < 100005; j += i) phi[j] = phi[j] / i * (i - 1);
}
as[0] = 0; as[1] = 1;
for(i = 2; i < 100005; ++ i) as[i] = phi[i] + as[i-1];
for(i = 2; i < 100005; ++ i)
if(!si[i]){
prime[k++] = i;
for(j = i * i; j < 100005; j += i) si[j] = 1;
}
}
void getp(long long n)
{
long long i;
cnt = 0;
for(i = 0; prime[i] * prime[i] <= n; ++ i)if(n % prime[i]==0){
has[cnt++] = prime[i];
while(n % prime[i]==0) n /= prime[i];
}
if(n > 1) has[cnt++] = n;
}
void dfs(long long x,long long flag,long long b,long long gcd)
{
long long i;
for(i = x; i < cnt; ++ i){
ans += flag * (b /(gcd * has[i]));
dfs(i+1,-flag,b,gcd*has[i]);
}
}
int main()
{
long long a,b,c,d,i,j,k,t,cas=0;
Init();
scanf("%I64d",&t);
while(t--){
scanf("%I64d %I64d %I64d %I64d %I64d",&a,&b,&c,&d,&k);
if(!k){ printf("Case %I64d: 0\n",++cas); continue;}
if(b > d){ i = b; b = d; d = i; }
d /= k; b /= k;
ans = (d - b) * b;
for(i = b + 1; i <= d; ++ i){
getp(i);
dfs(0,-1,b,1);
}
printf("Case %I64d: %I64d\n",++cas,ans+as[b]);
}
return 0;
}
//*
Please write a program to calculate the k-th positive integer that is coprime with m and n simultaneously. A is coprime with B when their greatest common divisor is 1.*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
long long prime[100005];
char si[100005];
long long has[100000],ct,ans;
void getprime()
{
long long i,j,k = 0;
for(i = 2; i < 100005; ++ i) if(!si[i]){
prime[k++] = i;
for(j = i * i; j < 100005; j += i) si[j] = 1;
}
}
void getp(long long n)
{
long long i;
for(i = 0; prime[i] * prime[i] <= n; ++ i)if(n % prime[i] == 0){
has[ct++] = prime[i];
while(n % prime[i]==0) n /= prime[i];
}
if(n > 1) has[ct++] = n;
}
void dfs(long long x,long long flag,long long gcd,long long n)
{
for(int i = x; i < ct; ++ i){
ans += flag * n / (gcd * has[i]);
dfs(i+1,-flag,gcd*has[i],n);
}
}
bool judge(long long n,long long k)
{
dfs(0,-1,1,n);
return ans >= k;
}
int main()
{
long long n,m,k,t,cas = 0;
getprime();
scanf("%I64d",&t);
while(t--){
scanf("%I64d %I64d %I64d",&m,&n,&k);
if(n==1&&m==1){ printf("Case %I64d: %I64d\n",++cas,k); continue; }
ct = 0; getp(n); getp(m);
sort(has,has+ct);
int i,j = 0;
for(i = 1; i < ct; ++ i) if(has[i] != has[j]) has[++j] = has[i];
ct = j + 1;
long long low = k,high = 1LL<<62,mid;
while(low < high)
{
mid = (low + high)>>1;
ans = mid;
if(judge(mid,k)) high = mid;
else low = mid + 1;
}
printf("Case %I64d: %I64d\n",++cas,low);
}return 0;
}
//求与N不互质的数的K次方(K=4),4次方求和公式n*(n+1)*(2*n+1)*(3*n*n+3*n-1)/30
#include<stdio.h>
long long mod = 1000000007;
long long prime[100005];
char si[100005];
long long as[100000],ct,ans;
long long gcd(long long x,long long y){ return y?gcd(y,x%y):x; }
void getprime()
{
long long i,j,k=0;
for(i = 2; i < 100005; ++ i)if(!si[i]){
prime[k++] = i;
for(j = i * i; j < 100005; j += i) si[j] = 1;
}
}
void dfs(long long x,long long flag,long long com,long long n)
{
long long a,b,c,d,g,i,tmp,k,m,comm;
for(i = x; i < ct; ++ i){
comm = com * as[i];
k = a = n / comm; b = a + 1;
c = a * 2 + 1;
d = 3 * a * a + 3 * a - 1;
m = 30;
g = gcd(a,m); a /= g; m /= g;
g = gcd(b,m); b /= g; m /= g;
g = gcd(c,m); c /= g; m /= g;
g = gcd(d,m); d /= g; m /= g;
tmp = comm * comm % mod; tmp = tmp * tmp % mod;
tmp = tmp * a % mod; tmp = tmp * b % mod;
tmp = tmp * (c%mod)%mod; tmp = tmp * (d%mod)%mod;
ans = (ans + mod + flag * tmp) % mod;
dfs(i+1,-flag,comm,n);
}
}
int main()
{
long long i,k,n,t;
getprime();
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
k = n;
ct = 0;
for(i = 0; prime[i]*prime[i]<=n; ++ i)if(n%prime[i]==0){
as[ct++] = prime[i];
while(n%prime[i]==0) n /= prime[i];
}
if(n>1)as[ct++] = n;
long long a = k,b = k + 1,c = 2*k + 1,d = 3*k*k+3*k-1,g;
n = 30; g = gcd(a,n); a /= g; n /= g;
g = gcd(b,n); b /= g; n /= g;
g = gcd(c,n); c /= g; n /= g;
g = gcd(d,n); d /= g; n /= g;
ans = a * b % mod;
ans = ans * (c%mod)%mod;
ans = ans * (d%mod)%mod;
dfs(0,-1,1,k);
printf("%I64d\n",(ans+mod)%mod);
}return 0;
}