LL n,m,p; LL qmul(LL a,LL b){// 龟速乘计算(a*b) % p LL res = 0; while (b){ if (b & 1) res = (res + a) % p;// b(2)的末位是1 a = (a + a) % p; b >>= 1;// b(2)向右移动一位 } return res; }
LL G(LL n,LL m){// 计算(f(n)-1) mod f(m) = (f(n) mod f(m) - 1) mod f(m) // 根据n/m,n%m,n/(2m)三个数进行分类讨论,注意是下取整,结果可能出现负数需要特判 if (m % 2 == 0)// m是偶数 { if (n / m % 2 == 0)// 且n/m是偶数,结果是f(n mod m)-1 (mod f(m)) { // 特判n整除m的情况,设n = k*m,利用情况1所归纳出的公式可知f(k*m)=f((k-1)*m)*f(m-1)=...=f(m)*xxx // 所以此时f(n) mod f(m) = 0 if (n % m == 0) return F(m)-1;// F(n % m) = 0,但取模结果为正,所以加上F(m) elsereturn F(n % m) - 1; } else// 且n/m是奇数,结果是f(m-1)*f(n mod m) (mod(f(m)) { return H(m,n % m); } } else// m是奇数 { if (n / m % 2 == 0 && n / m / 2 % 2 == 0)// 且n/m和n/(2m)都是偶数,结果是f(n mod m)-1 (mod f(m)) { if (n % m == 0) return F(m)-1;// F(n % m) = 0,但取模结果为正,所以加上F(m) elsereturn F(n % m) - 1; } elseif (n / m % 2 == 0 && n / m / 2 % 2)// 且n/m是偶数,n/(2m)是奇数,结果是f(m)-f(n mod m)-1 (mod f(m)) { // 特判f(m) = f(n mod m)的情况,只可能是f(1) = f(2) if (n % m == 1 && m == 2) return F(m)-1; elsereturn F(m) - F(n % m) - 1; } elseif (n / m % 2 && n / m / 2 % 2 == 0)// 且n/m是奇数,n/(2m)是偶数,结果是f(m-1)*f(n mod m)-1 (mod(f(m)) { return H(m,n % m); } else// 且n/m是奇数,n/(2m)是奇数,结果是f(m)-[f(m-1]*f(n mod m) (mod(f(m))]-1 (mod(f(m)) { // 当n mod m 是奇数时,套用结论,f(m-1)*f(n mod m) = f(m- n mod m) if (n % m % 2) { // 特判f(m) = f(m- n mod m)的情况,只可能是f(1) = f(2) if (m == 2 && m - n % m == 1) return F(m) - 1; elsereturn F(m) - F(m - n % m) - 1; } else// 当n mod m 是偶数时,套用结论,f(m-1)*f(n mod m) = f(m) - f(m- n mod m) { // 结果是f(m - n mod m)-1 (mod(f(m)),f(m - n mod m)不可能=0,不用特判 return F(m - n % m) - 1; } } } }
intmain(){ while(scanf("%lld%lld%lld",&n,&m,&p) != EOF){ printf("%lld\n",(G(n+2,m) % p + p) % p);// 最终输出的答案应该是:(f(n+2)-1) mod f(m) mod p } return0; }
v1.5.2