#include <iostream>
using namespace std;
using ll =long long;
const ll Max=2e6+5;
ll A[Max]; // 存储序列A的数组,A[1]~A[N]对应题目中的A₁~A_N
ll B[Max]; // 存储序列B的数组,B[1]~B[N]对应题目中的B₁~B_N
int main() {
// 输入参数:N为序列长度,A[1]为序列A的首项,M为递推公式中的取模值
ll N,M;
cin>>N>>A[1]>>M;
// 算法步骤1:递推生成序列A
// 核心思想:按照题目定义的递推公式 Aᵢ = (Aᵢ₋₁ + 7×i) % M 生成A[2]~A[N]
for(ll i=2;i<=N;i++){
A[i]=(A[i-1]+7*i)%M;
}
// 算法步骤2:用倍数法计算序列B(高效版)
// 核心思想:d是k的约数 ⇨ k是d的倍数,遍历每个约数d,给其所有倍数k的B[k]累加A[d]
for(ll i=1;i<=N;i++){ // i代表当前遍历的约数d
ll j=1;
while(i*j<=N){ // 遍历d的所有倍数k = d×j(k≤N)
B[i*j]+=A[i]; // 因为d是k的约数,所以B[k]累加A[d]
j++;
}
}
// 算法步骤3:对所有Bᵢ进行异或运算,得到最终答案
// 核心思想:从B[1]开始,依次异或B[2]~B[N],初始值为B[1]
ll ans=B[1];
for(ll i=2;i<=N;i++){
ans^=B[i]; // 逐个异或,等价于 ans = ans ^ B[i]
}
// 输出最终的异或结果
cout<<ans;
return 0;
}