牌
思路:
以样例为例,经过一次变化
1 2 3 4 5 6
4 1 5 2 6 3
我们发现 1卡牌到了 2位置 ,2卡牌到了 4位置,3卡牌到了 6位置, 很明显看出:位置变化是原位置的 2 倍。那后面的岂不是超出了范围?我们再 mod (n+1) (因为要保证在 1~6 的范围内)
设 x 为牌面大小(等同于初始的位置,也就是我们要求的 ans), L 是题目给定的位置,可以有:
x * 2^m = L % (n+1)
x = L* (2^m)-1 % (n+1)
因为(2^m)-1 的逆元并不好求,而 (2^m)-1 = (2-1)^m ,所以我们就把问题转变为:求 2-1 的逆元,可以有:
2*A Ξ 1 % (n+1)
A=(n+2) / 2
x =( (n+2)/2 )^m * L %(n+1) //终于推完,累……,非常感谢yx学长的指点>:<
std正解(相思豆想不到的逆元)
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int mod,n,m,l; inline ll ksm(int a,int b){ ll ans=1; while(b){ if(b&1) ans=1ll*a*ans%mod; a=1ll*a*a%mod;b>>=1; } return ans; } int main() { scanf("%d%d%d",&n,&m,&l); mod=n+1; printf("%lld\n",ksm(n/2+1,m)*l%(n+1)); return 0; } /* 6 2 3 6 张牌 做 2 次 问第 3 */
从0到1很难,但从1到100很容易