题目描述

  有\(n\)个方案,编号为\(1\ldots n\)。

  最开始你不知道每个方案的编号。

  你要按顺序提出这些方案。

  每一个时刻你要做以下事情:

   如果你阅读过下一个方案,就提出这个方案。

   否则随机选一个你还没有阅读过的方案,然后阅读这份方案。如果这份方案是你马上要提出的方案,就提出这份方案,否则把这份方案放回到桌子上。

  问你期望耗时。对\(p^k\)取模。

  \(p\leq {10}^5,np^k\leq {10}^{18}\)

题解

  考虑你要在哪种方案上面浪费一个单位的时间,那就是你选择的方案是你下一个要提出的方案。

  显然你会在其他方案上面浪费两个单位的时间。

  设\(f_i\)为还有\(i\)个未阅读的方案,提出所有方案需要的时间。

\[\begin{align}
f_n&=f_{n-1}+\frac{1}{n}+2\frac{n-1}{n}\\
f_n&=2n-\sum_{i=1}^n\frac{1}{i}
\end{align}
\]

  然后直接套用这题的做法就行了。

  时间复杂度:\(O(pk\log_p n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef __int128 lll;
ll p;
ll mul(ll a,ll b,const ll &c)
{
return (lll)a*b%c;
}
ll fp(ll a,ll b){ll s=1;for(;b;b>>=1,a*=a)if(b&1)s*=a;return s;}
ll fp(ll a,ll b,const ll &c){ll s=1;for(;b;b>>=1,a=mul(a,a,c))if(b&1)s=mul(s,a,c);return s;}
int pri[1000010];
int b[1000010];
ll pw[1000010];
int cnt;
ll ss[100][100];
void getstirling(ll k,const ll &md)
{
ss[0][0]=1;
for(int i=1;i<=k;i++)
for(int j=1;j<=i;j++)
ss[i][j]=(ss[i-1][j-1]-mul(i-1,ss[i-1][j],md))%md;
}
ll gao(ll n,ll k,const ll &md)
{
ll s=(n+1)/(k+1);
ll v=s*(k+1);
for(ll i=n+1;i>=n-k+1;i--)
s=mul(s,(i==v?1:i),md);
return s;
}
void gets(ll *s,ll n,ll k,const ll &md)
{
s[0]=n;
for(int i=1;i<=k;i++)
{
s[i]=gao(n,i,md);
for(int j=0;j<i;j++)
s[i]=(s[i]-mul(ss[i][j],s[j],md))%md;
}
s[0]++;
}
ll s1[100];
ll s2[100];
ll g(ll n,const ll &md,ll k)
{
ll r=n%p;
getstirling(k,md);
gets(s1,n/p-1,k,md);
gets(s2,n/p,k,md);
ll res=0,s;
ll t=fp(p,k)-fp(p,k-1)-1;
for(int i=0;i<k;i++)
{
s=0;
pw[1]=1;
cnt=0;
for(int j=1;j<p;j++)
b[j]=0;
for(int j=2;j<p;j++)
{
if(!b[j])
{
pri[++cnt]=j;
pw[j]=fp(fp(j,i+1),t,md);
}
for(int k=1;k<=cnt&&j*pri[k]<p;k++)
{
b[j*pri[k]]=1;
pw[j*pri[k]]=mul(pw[j],pw[pri[k]],md);
if(j%pri[k]==0)
break;
}
}
for(int j=1;j<p;j++)
if(j<=r)
s=(s+mul(s2[i],pw[j],md))%md;
else
s=(s+mul(s1[i],pw[j],md))%md;
s=mul(s*(i&1?-1:1),fp(p,i),md);
res=(res+s)%md;
}
// fprintf(stderr,"G(%lld, %lld) = %lld\n",n,md,(res+md)%md);
return res;
}
ll f(ll n,const ll &md,ll k)
{
if(!n)
return 0;
return (g(n,md,k)+f(n/p,md*p,k+1)/p)%md;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
ll n,k;
scanf("%lld%lld%lld",&p,&k,&n);
const ll md=fp(p,k);
ll ans=f(n,md,k);
ans=(2*n-ans)%md;
ans=(ans+md)%md;
printf("%lld\n",ans);
return 0;
}

【XSY2808】董先生的休闲方案 组合数学的更多相关文章

  1. 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】

    U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...

  2. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  3. poj 3734 Blocks 快速幂+费马小定理+组合数学

    题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...

  4. 马化腾:办公用QQ休闲用微信[Dream Catchers论坛]

    近日,香港大学举办以创新创业为主题的Dream Catchers论坛.其中腾讯董事局主席马化腾在下午两点四十五分在李兆基会议中心做了专题演讲,分享了自己的创业经历并回答了媒体人张力奋有关产品.整整对手 ...

  5. 组合数学or not ---- n选k有重

    模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...

  6. 消息系统Kafka介绍 - 董的博客

    1.  概述 Kafka是Linkedin于2010年12月份开源的消息系统,它主要用于处理活跃的流式数据.活跃的流式数据在web网站应用中非常常见,这些数据包括网站的pv.用户访问了什么内容,搜索了 ...

  7. 历时一周,unity3d+xtion打造我的第一个休闲体感小游戏《空降奇兵》

    1.游戏介绍 本游戏属于休闲小游戏,主要操作如下: 菜单控制:举起左手或右手,点击左边或者右边的菜单:挥动左手或右手,选择关卡: 操作方式:玩家跳跃,游戏中的伞兵从飞机开始降落:玩家通过控制伞兵的左右 ...

  8. cocos2d-x 多分辨率适配详解(转载),以前北京团队设计的游戏,也是用这套方案

    http://blog.csdn.net/kyo7552/article/details/17163487 多种分辨率的适配一直都是一个蛋疼的问题,各家公司可能都有自己的一套方案.今天我为大家介绍的是 ...

  9. CF_402F dp+组合数学

    题目链接:http://codeforces.com/problemset/problem/403/D /**算法分析: 这道题综合的考察了dp背包思想和组合数学 */ #include<bit ...

随机推荐

  1. Linux安装Apache常见报错(一)

    启动Apache提示报错:Could not reliably determine the server's fully qualified domain name, using localhost, ...

  2. NoSQL是什么?

    导读 NoSQL(not only sql,不仅仅是SQL),是一项全新的数据库革命性运动,泛指非关系型数据库,对于NoSQL这个新兴的名词,每个人的理解都不同.其实NoSQL一词最早出现于1998年 ...

  3. Nagios 系统监控

    Nagios 系统监控 Nagios 是一款免费的开源 IT 基础设施监控系统,功能强大,灵活性强,能有效监控 Windows.Linux.VMware 和 Unix 主机状态,交换机.路由器等网络设 ...

  4. 03-Linux的shell命令 .doc

    快捷键 基本操作和命令 Cd转换文件夹 以/开头的是绝对路径 没有/相对路径 ../代表上一级目录 Tab补充 Ctrl+R 查找历史输入过的命令 箭头上也代表能够查询以往输入的命令 Ctrl+C 终 ...

  5. Python之参数类型、变量

    一.参数类型 (一)形参与实参 要使用局部变量时,只能通过return的方式返回 def my(name): #函数体 return name my('lrx') #name是形参,lrx是实参 不写 ...

  6. java list 去重

    Guava ImmutableSet源码去重处理,Hash处理 - 汪小哥 - CSDN博客 https://blog.csdn.net/u012881904/article/details/6895 ...

  7. 简要了解 MySql 5.5/5.6/5.7/8 出现的新特性

    MySQL的开发周期 在比较之前,首先提一下MySQL的开发周期. MySQL一个大版本的开发,大致经历如下几个阶段: Feature Development Feature Testing Perf ...

  8. js this的含义以及讲解

    this关键字是一个非常重要的语法点.毫不夸张地说,不理解它的含义,大部分开发任务都无法完成. 首先,this总是返回一个对象,简单说,就是返回属性或方法“当前”所在的对象. 下面来两个例子来让大家更 ...

  9. react组件选项卡demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. [转帖]Ipvsadm参数详解(常用命令)

    Ipvsadm参数详解(常用命令) 2013年11月29日 12:41:40 怀素1980 阅读数:15901   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...