思路:

以样例为例,经过一次变化

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
",ksm(n/2+1,m)*l%(n+1));
    return 0;
}
/*
6 2 3
6 张牌 做 2 次 问第 3 
*/
从0到1很难,但从1到100很容易
原文地址:https://www.cnblogs.com/qseer/p/9563219.html