/*
旋转:n个点顺时针或者逆时针旋转i个位置的置换,循环数为gcd(n,i)
翻转:
N为偶数时:
(1)这种是经过某个顶点i与中心的连线为轴的翻转,即对称轴过顶点,有对称性,循环数为:n/2. 所以此种共n/2种翻转:
(2)这种是以顶点i和i+1的连线的中点与中心的连线为轴的翻转,即对称轴不过顶点,同样,根据对称性,循环数为n/2+1.
且有n/2种翻转。
N为奇数: 循环数为(n+1)/2.
所以给定长度n,共有2n种置换。
*/
#include<iostream>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include<vector>
using namespace std;
int prime[24];
int num,n,p;
void getprime()
{
prime[0]=2;
prime[1]=3;
prime[2]=5;
prime[3]=7;
prime[4]=11;
prime[5]=13;
prime[6]=17;
prime[7]=19;
prime[8]=23;
}
int euler(int x)
{
int res=x;
for(int i=0;prime[i]*prime[i]<=x;i++)
{
if(x%prime[i]==0)
{
res=res/prime[i]*(prime[i]-1);
while(x%prime[i]==0)
{
x/=prime[i];
}
}
}
if(x>1) res=res/x*(x-1);
return res;
}
__int64 fun(int a,int b)
{
__int64 ret=1;
a=a;
while(b>0)
{
if(b&1)ret=(ret*a);
a=(a*a);
b>>=1;
}
return ret;
}
int main()
{
getprime();
int c=3;
while(scanf("%d",&n),n!=-1)
{
if(n==0){puts("0");continue;}
__int64 ans = 0;
for (int i = 1; i <= n; i++)if (n % i == 0)
{
ans += fun(c, i) * euler(n / i);
}
if (n & 1) ans += n * fun(c, n / 2 + 1);
else ans += n / 2 * (fun(c, n / 2) + fun(c, n / 2 + 1));
cout << ans / (2 * n) << endl;
}
return 0;
}
/*
与上一题同 不赘述
*/
#include<iostream>
#include <stdlib.h>
#include <algorithm>
#include <stdio.h>
#include<vector>
using namespace std;
int prime[24];
int num,n,p;
void getprime()
{
prime[0]=2;
prime[1]=3;
prime[2]=5;
prime[3]=7;
prime[4]=11;
prime[5]=13;
prime[6]=17;
prime[7]=19;
prime[8]=23;
}
int euler(int x)
{
int res=x;
for(int i=0;prime[i]*prime[i]<=x;i++)
{
if(x%prime[i]==0)
{
res=res/prime[i]*(prime[i]-1);
while(x%prime[i]==0)
{
x/=prime[i];
}
}
}
if(x>1) res=res/x*(x-1);
return res;
}
__int64 fun(int a,int b)
{
__int64 ret=1;
a=a;
while(b>0)
{
if(b&1)ret=(ret*a);
a=(a*a);
b>>=1;
}
return ret;
}
int main()
{
getprime();
int c=3;
while(scanf("%d%d",&c,&n),n+c)
{
__int64 ans = 0;
for (int i = 1; i <= n; i++)if (n % i == 0)
{
ans += fun(c, i) * euler(n / i);
}
if (n & 1) ans += n * fun(c, n / 2 + 1);
else ans += n / 2 * (fun(c, n / 2) + fun(c, n / 2 + 1));
cout << ans / (2 * n) << endl;
}
return 0;
}