.
不巧. 刚出去喝了点儿酒.代码就不给你敲了.况且我C++不太会用,
平时用C,有时为了方便也就是用用C++里面的一些库函数.
帮你看看怎么做吧,如果分析的不对你还是去百度相应的题号和题目名称,
会有更为详尽的题解的.
相应的公式我也是现查的,如果有兴趣建议你看一看数论方面的知识.
下面说说这个题吧:
(知识牵连比较大,做好心理准备.所以,如果你不理解这些,给你代码你也看不懂.)
(你先看个大概,再去看链接里的内容.)
题目中,括号里的是个等比数列结果是:n(n^k-1)/(n-1),
所以现在的问题变成了它(下面用a/b代替)对m取余.
(之前想给你详细写一下,但是太多,简单的给你罗列下大概,
不懂的你在hi我或者直接百度题解吧.)
可以知道a和b都很大,直接求a/b的值是不可能的,所以这时【乘法逆元】就有用了.
【乘法逆元】
定义:
满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元.((a*k)%p=1)
为什么要有乘法逆元呢?
当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元.我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p.其结果与(a/b) mod p等价.
引用自这里(有简单的证明):http://blog.sina.com.cn/s/blog_7c4c33190100s48a.html
求k等同于求解求解二元不定方程:a*k=p*x+1,k和x是未知数.
而这个有用到了【扩展欧几里得】
你看看百度百科的解释吧:http://baike.baidu.com/view/1478219.htm
(这个我并没有仔细看,如果看不懂,在网上试着搜索别人关于扩展欧几里得的解释吧)
现在变成了求(a*k)%m 它等同于((a%m)*k)%m=((a%m)*(b%m))%m;
此时,解决了除b(就是除(n-1))的问题,但是a(n(n^k-1))对m取余怎么办?
这里用到了【快速幂取模】基于的是【快速幂】的算法思想.
去这里了http://blog.csdn.net/a363514083/article/details/6771629
至此,问题可算是解决了.
引用了很多别人的写的东西,如果看不懂,试着搜同一个关键词,参考其他人对相关知识的解释
回答的晚了些,还请见谅,呵呵~
.