题面

https://www.lydsy.com/JudgeOnline/problem.php?id=5015

题解

首先把k=1,k=2,k=3的手推一遍

然后发现一些规律 就是数列可以表示成$a_i=2a_{i-1}+f(i)$的形式

然后f(i)算一算之后我们得到

然后我们试图求这个东西的通项公式

我们要把它变成$a_i+f(i)=2(a_{i-1}+f(i-1))$的形式就好了

那么我们设

一共k个变量 对于每一个$n^i$我们根据他的系数可以列一个方程 一共k个方程

所以高斯消元把它解出来就结束了

Code

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll read(){
ll x=,f=;char c=getchar();
while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
while(c>='' && c<=''){x=x*+c-'';c=getchar();}
return x*f;
} const ll mod=1000000007ll;
ll n;
int k;
ll mat[][]; ll calc(ll a,ll b){
ll ret=;
for(int i=;i<=b;i++)
ret=ret*(a-i+)/i;
return ret%mod;
} ll ksm(ll a,ll b){
if(b==) return ;
ll nw=;
if(b==) return a%mod;
if(b&) nw=a;
ll ret=ksm(a,b/);
return ret*(nw%mod)%mod*ret%mod;
} inline ll pd(ll x){
if(x&) return -;
return ;
}
ll ans[]; int main(){
#ifdef LZT
//freopen("in","r",stdin);
#endif
n=read(),k=read();
for(int i=;i<=k;i++){
mat[i][]=calc(k,i)*pd(i+);
mat[i][i]--;
int st=i-;
for(int j=;j<=i;j++)
mat[i][j]+=(*calc(k-j,st)*pd(st--));
}
for(int i=;i<=k;i++){
ll nw=;
for(int j=;j<i;j++) nw=nw+mat[i][j]*ans[j];
ans[i]=(mat[i][]-nw)/mat[i][i];
}
for(int i=;i<=k;i++)
ans[i]=ans[i]%mod;
ll res=ans[k]*ksm(,n)%mod;
for(int i=;i<=k;i++){
ll nw=ans[i]*ksm(n,k-i)%mod;
res=(res-nw+mod)%mod;
}
printf("%lld\n",res); return ;
}

Review

这样做的动机?

就是先把k=2,k=3的情况推了一下 然后发现很相似 f(i)的次数与k相关而k很小 只有10

然后就试图用程序表达手推的过程 发现消元就可以了 然后就做了出来

bzoj 5015 [Snoi2017]礼物的更多相关文章

  1. bzoj 5015 [Snoi2017]礼物 矩阵乘法

    5015: [Snoi2017]礼物 Time Limit: 15 Sec  Memory Limit: 512 MBSubmit: 163  Solved: 115[Submit][Status][ ...

  2. BZOJ_5015_[Snoi2017]礼物_矩阵乘法

    BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...

  3. 洛谷P5364 [SNOI2017]礼物 题解

    传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...

  4. bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...

  5. bzoj 4827: [Hnoi2017]礼物 [fft]

    4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...

  6. [bzoj5015][Snoi2017]礼物

    来自FallDream的博客,未经允许,请勿转载,谢谢. 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋 ...

  7. bzoj P5016[Snoi2017]一个简单的询问——solution

    Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出   get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input ...

  8. 【bzoj5015】[Snoi2017]礼物 矩阵乘法

    题目描述 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋友到来以后,都会带给他之前所有人带来的礼物个数再 ...

  9. [BZOJ]5018: [Snoi2017]英雄联盟 DP

    [Snoi2017]英雄联盟 Time Limit: 15 Sec  Memory Limit: 512 MBSubmit: 270  Solved: 139[Submit][Status][Disc ...

随机推荐

  1. mysql 查询正在执行的事务以及等待锁 常用的sql语句

    使用navicat测试学习: 首先使用set autocommit = 0;(取消自动提交,则当执行语句commit或者rollback执行提交事务或者回滚)   在打开一个执行update查询 正在 ...

  2. Javascript对象的技巧和陷阱

    创建对象的3种方法 方法1 直接创建 var obj = { name: "mike", age: 10 } 方法2 用new创建 var ob = new Date(); 方法3 ...

  3. 文件宝局域网传输/播放功能使用帮助(Mac电脑用户)

    使用局域网账户密码登录,可以访问电脑上所有文件 使用游客无账户密码登录,只能访问电脑上指定共享文件夹的文件. 怎么设置共享文件夹请参考: 1.打开“共享”偏好设置(选取苹果菜单 >“系统偏好设置 ...

  4. ExtJs4.2 开发问题总结

    1. 在开发treegrid中,store属性autoLoad:false没有作用,还会默认自动加载.目前解决办法在control下监听treegrid的afterrender,当加载完后,再调一次s ...

  5. proc_create的使用方法

    proc_create的使用方法 proc文件系统是个有用的东东.创建一个proc虚拟文件,应用层通过读写该文件,即可实现与内核的交互.proc虚拟文件是如何创建的呢? 先看看比较简单的,创建proc ...

  6. wukong引擎源码分析之索引——part 2 持久化 直接set(key,docID数组)在kv存储里

    前面说过,接收indexerRequest的代码在index_worker.go里: func (engine *Engine) indexerAddDocumentWorker(shard int) ...

  7. linux编程 fmemopen函数打开一个内存流 使用FILE指针进行读写访问

    fmemopen()函数打开一个内存流,使你可以读取或写入由buf指定的缓冲区.其返回FILE*fp就是打开的内存流,虽然仍使用FILE指针进行访问,但其实并没有底层文件(并没有磁盘上的实际文件,因为 ...

  8. oracle 转移表空间

    一.系统表空间数据文件迁移:SQL> conn /@tmpdb as sysdba 已连接. SQL> desc dba_data_files; 名称 是否为空? 类型 --------- ...

  9. Redhat 安装perl模块

    CPAN上下载要安装的模块 解压 gzip -d DBD-mysql-4.006.tar.gz tar xvf DBD-mysql-4.006.tar 然后进入DBD-mysql-4.006目录,执行 ...

  10. UVA-11082 Matrix Decompressing(有上下界的最大流)

    题目链接: Matrix Decompressing 题意: 给一个矩阵的每行和每列的和,(给的是前i行或者列的和); 矩阵中每个元素的值在1到20之间,找出这样的一个矩阵: 思路: 把它转化成一个二 ...