BZOJ 1965 洗牌

答案((n/2+1)^m*l)%(n+1)。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,m,l;
long long mul(long long a,long long b)
{
    long long d=(long long)floor(a*(long double)b/(n+1)+0.5);
    long long ret=a*b-d*(n+1);
    if (ret<0) ret+=n+1;
    return ret;
}
long long f_pow(int a,int b)
{
    int ans=1,base=a;
    while (b)
    {
        if (b&1) ans=mul(ans,base)%(n+1);
        base=mul(base,base)%(n+1);
        b>>=1;
    }
    return ans%(n+1);
}
int main()
{
    scanf("%lld%lld%lld",&n,&m,&l);
    printf("%lld\n",mul(l,f_pow(n/2+1,m))%(n+1));
    return 0;
}
时间: 2024-08-11 03:36:02

BZOJ 1965 洗牌的相关文章

luogu_P2054 bzoj 1965 洗牌 【题解】 快速幂 快速乘

题目链接: Luogu:https://www.luogu.org/problem/P2054 bzoj:https://www.lydsy.com/JudgeOnline/problem.php?id=1965 找到规律: 上一次在x位置,下一次就会在 x*2%(n+1) 位置 那么就是要求: x * (2^m) = L(mod n+1) 第一反应exgcd,但是突然感觉有点不太优秀. 因为n是偶数(题目说了) 所以2和n+1为互质 所以设 z *  2 =1(mod n+1) z就为2在mo

【BZOJ】【1965】SHUFFLE 洗牌

扩展欧几里德+快速幂 每次转换位置:第x位的转移到2*x %(n+1)这个位置上 那么m次后就到了(2^m)*x %(n+1)这个位置上 那么找洗牌m次后在 l 位置上的牌就相当于解线性模方程: (2^m)*x ≡ l (mod n+1)  扩展欧几里得即可 1 /************************************************************** 2 Problem: 1965 3 User: Tunix 4 Language: C++ 5 Result

BZOJ 1965 AHOI2005 SHUFFLE 洗牌 数论

题目大意:给定偶数张牌,问m次洗牌之后第l张牌是多少 x*2^m==l (mod n+1) x=(n/2+1)^m*l mod n+1 快速幂+快速乘233 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MOD (n+1) using namespace std; typedef unsigned long long ll; long

1965: [Ahoi2005]SHUFFLE 洗牌

1965: [Ahoi2005]SHUFFLE 洗牌 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 408  Solved: 240[Submit][Status][Discuss] Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间.玩了几局之后,大家觉得单纯玩扑克

[转]完美洗牌(Perfect Shuffle)问题

[转]原博文地址:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md 完美洗牌算法 题目详情 有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法. 题目来源:此题是去年2013年UC的校招笔试题,看似简单,按照题目所要

4月6日--关于算法数的练习题--扑克洗牌

扑克 1.定义一个数组,存放1-52(分别表示52张扑克,不含大.小王)其中1表示黑桃A,2表示黑桃2...,13表示 黑桃K,14表示红桃A......) 2.随机排列该数组 3.再将牌平均分给4个玩家(分成4个数组,按照发牌规则) 4.排序输出每个玩家的扑克(先按照花色:黑桃.红桃.梅花,方块;再按照大小) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q

2017联合办公洗牌关键词:生存、扩张、盈利、因地制宜_转

转自:http://www.iheima.com/zixun/2017/0206/161059.shtml "大众创业,万众创新",不只催生了千军万马的创新创业者,更衍生出联合办公这样独特的办公模式.这一办公模式从无到有,从最初单一的复制借鉴到今天品类繁多的百花齐放,已经进化成对创业者有着致命吸引力的办公地址选择. 粗略统计,截至2016年初,中国联合办公空间数量已经超过2300家. 福兮祸所依,在各式各样的联合办公野蛮生长的背后,可以预见的是市场优胜劣汰的残酷洗牌. 未来联合办公的发

hdu 1210 Eddy&#39;s 洗牌问题

Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这也是最初的牌的顺序.通过一次洗牌可以把牌的序列变为n+1,1,n+2,2,n+3,3,n+4,4..2n,n.那么可以证明,对于任意自然数N,都可以在经过M次洗牌后第一次重新得到初始的顺序.编程对于小于100000的自然数N,求出M的值. Input 每行一个整数N Output 输出与之对应的M Sa

java语言实现简单的洗牌,发牌

java学习过程中,老师让写了个简单的斗地主洗牌发牌的程序,一下就是程序代码: package com.java.lei.homework; import java.util.Arrays; import java.util.Random; public class PokerGame { //1.创建数组,用以存储扑克牌 static String[] pokers = new String[54]; public static void main(String[] args) { //2.创