[SHOI2015]超能粒子炮·改
嘟嘟嘟
先看了一遍lucas,还是只能拿50分(似乎已经满足了)。
正解当然还是看某个大佬的啦。
我们要求的就是
\]
然后根据lucas定理,就开始愉快的推式子了……
f(n, k)
&= \sum _ {i = 0} ^ {k} C _ {n} ^ {i} \% p \\
&= \sum _ {i = 0} ^ {k} C_ {n / p} ^ {i / p} * C _ {n \% p} ^ {i \% p} \\
&= C_{n / p} ^ {0} \sum _ {i = 0} ^ {p - 1} C _ {n \% p} ^ {i} + C _ {n / p} ^ {1} \sum _ {i = 0} ^ {p - 1} C _ {n \% p} ^ {i} + \ldots + C_{n / p} ^ {k / p - 1} \sum _ {i = 0} ^ {p - 1} C _ {n \% p} ^ {i} + C _ {n / p} ^ {k / p} \sum _ {i = 0} ^ {k \% p} C _ {n \% p} ^ {i}\\
&= \sum _ {i = 0} ^ {p - 1} C _ {n \% p} ^ {i} * (C _ {n / p} ^ {0} + C_{n / p} ^ {1} + \ldots + C_{n / p} ^ {k / p - 1}) + C _ {n / p} ^ {k / p} \sum _ {i = 0} ^ {k \% p} C _ {n \% p} ^ {i} \\
&= f(n \% p, p - 1) * f(n / p, k / p - 1) + C _ {n / p} ^ {k / p} * f(n \% p, k \% p) \\
\end{align*}
\]
然后把\(f(n \% p, k \% p)\)预处理一下,就完事了。(说的真轻松……)
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 2505;
const int p = 2333;
inline ll read()
{
  ll ans = 0;
  char ch = getchar(), last = ' ';
  while(!isdigit(ch)) last = ch, ch = getchar();
  while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
  if(last == '-') ans = -ans;
  return ans;
}
inline void write(ll x)
{
  if(x < 0) x = -x, putchar('-');
  if(x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
ll n, K;
ll C[maxn][maxn], f[maxn][maxn];
In ll inc(ll a, ll b) {return a + b >= p ? a + b - p : a + b;}
In ll lucas(ll n, ll m)
{
  if(!m || n == m) return 1;
  if(n < m) return 0;
  return C[n % p][m % p] * lucas(n / p, m / p) % p;
}
In ll F(ll n, ll K)
{
  if(K < 0) return 0;
  if(!n || !K) return 1;
  if(n < p && K < p) return f[n][K];
  return inc(f[n % p][p - 1] * F(n / p, K / p - 1) % p, lucas(n / p, K / p) * f[n % p][K % p] % p);
}
In void init()
{
  for(int i = 0; i < maxn; ++i) C[i][0] = 1;
  for(int i = 1; i < maxn; ++i)
    for(int j = 1; j <= i; ++j)
      C[i][j] = inc(C[i - 1][j - 1], C[i - 1][j]);
  for(int i = 0; i < maxn; ++i) f[i][0] = 1;
  for(int i = 0; i < maxn; ++i)
    for(int j = 1; j < maxn; ++j)
      f[i][j] = inc(C[i][j], f[i][j - 1]);
}
int main()
{
  init();
  int T = read();
  while(T--)
    {
      n = read(), K = read();
      write(F(n, K)), enter;
    }
  return 0;
}
[SHOI2015]超能粒子炮·改的更多相关文章
- Bzoj 4591: [Shoi2015]超能粒子炮·改  数论,Lucas定理,排列组合
		4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 178 Solved: 70[Submit][Stat ... 
- bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]
		4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ... 
- 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)
		[BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ... 
- 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告
		P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ... 
- bzoj4591 / P4345 [SHOI2015]超能粒子炮·改
		P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ... 
- BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理
		BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理 Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以 ... 
- Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)
		Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ... 
- 【bzoj4591】[Shoi2015]超能粒子炮·改  Lucas定理
		题目描述 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ... 
- bzoj4591 [Shoi2015]超能粒子炮·改
		Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威 ... 
- loj 2038 / 洛谷 P4345 [SHOI2015] 超能粒子炮・改 题解
		好玩的推式子 题目描述 曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改--一种可以发射威力更加强大的粒子流的神秘装置. 超能粒子炮・改相比超能粒子炮,在威力上 ... 
随机推荐
- VM扩展磁盘大小
			1.通过扩展磁盘的方法增大磁盘大小 2.然后开启Linux 此时查看磁盘 df -h 并没有增加,使用 fdisk -l 查看发现已经扩展 使用 root 用户,进入到 ~ 家目录下面. 3.使用 ... 
- javascript浅拷贝深拷贝详解
			一.浅拷贝 浅拷贝在现实中最常见的表现在赋值上面,例如 <!DOCTYPE html> <html lang="en"> <head> < ... 
- js 两数组去除重复数值
			//两数组去除重复数值 mergeArray: function(arr1, arr2) { for (var i = 0; i < arr1.length; i++) { for (var j ... 
- HDU4609 3-idiots(生成函数)
			题意 链接 Sol 这个题就很休闲了.. 首先这是个数数题,我们要求的是\(\frac{\sum{[a_i + a_j > a_k]}}{C_n^3}\) 其中\(a\)按从小到大排序, \(i ... 
- loj#2049. 「HNOI2016」网络(set 树剖 暴力)
			题意 题目链接 Sol 下面的代码是\(O(nlog^3n)\)的暴力. 因为从一个点向上只会跳\(logn\)次,所以可以暴力的把未经过的处理出来然后每个点开个multiset维护最大值 #incl ... 
- git 入门教程之紧急修复
			和往常一样,每个人团队开发者都在自己的本地分支上进行日常工作,相互独立又相互联系,一直以来相安无事,可是某天下午,上级领导突然急冲冲的打电话告诉你线上出bug了,需要你紧急修复,下班之前必须解决! 我 ... 
- 设计模式java----单例模式
			一.懒汉式单例 在第一次调用的时候实例化自己,Singleton的唯一实例只能通过getInstance()方法访问.线程不安全 /** * Created by Admin on 2017/3/19 ... 
- mssql sqlserver for xml EXPLICIT 用法详解说明
			摘要:下文通过举例的方式,详细说明"for xml EXPLICIT"关键字的用法,如下所示:实验环境:sql server 2008 R2 EXPLICIT的功能:将数据表采用特 ... 
- hive笔记:转义字符的使用
			hive中的转义符 Hadoop和Hive都是用UTF-8编码的,所以, 所有中文必须是UTF-8编码, 才能正常使用 备注:中文数据load到表里面, 如果字符集不同,很有可能全是乱码需要做转码的, ... 
- c/c++ vector,map,set,智能指针,综合运用的小例子
			标准库,智能指针,综合运用的小例子 功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次. 比如查询单词:你好 输出的结果: 你好 出现了:2次 (行号 2)xxxxxxx 你好 (行 ... 
