bzoj 5015 [Snoi2017]礼物
题面
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]礼物的更多相关文章
- bzoj 5015 [Snoi2017]礼物 矩阵乘法
5015: [Snoi2017]礼物 Time Limit: 15 Sec Memory Limit: 512 MBSubmit: 163 Solved: 115[Submit][Status][ ...
- BZOJ_5015_[Snoi2017]礼物_矩阵乘法
BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...
- 洛谷P5364 [SNOI2017]礼物 题解
传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...
- bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...
- bzoj 4827: [Hnoi2017]礼物 [fft]
4827: [Hnoi2017]礼物 题意:略 以前做的了 化一化式子就是一个卷积和一些常数项 我记着确定调整值还要求一下导... #include <iostream> #include ...
- [bzoj5015][Snoi2017]礼物
来自FallDream的博客,未经允许,请勿转载,谢谢. 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋 ...
- bzoj P5016[Snoi2017]一个简单的询问——solution
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input ...
- 【bzoj5015】[Snoi2017]礼物 矩阵乘法
题目描述 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋友到来以后,都会带给他之前所有人带来的礼物个数再 ...
- [BZOJ]5018: [Snoi2017]英雄联盟 DP
[Snoi2017]英雄联盟 Time Limit: 15 Sec Memory Limit: 512 MBSubmit: 270 Solved: 139[Submit][Status][Disc ...
随机推荐
- OpenStack源码系列---nova-conductor
nova-conductor启动的也是一个rpc server,代码框架和nova-compute类似,所以我也懒得再详细分析一遍服务启动的过程.nova-api那篇文章的最后我说"cctx ...
- 值得收藏的45个Python优质资源(附链接)
REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy 构建专业的 REST API https://www.udemy.com/rest- ...
- Android如果动态改变CursorAdapter Item个数
//adapter内部类 private class SearchAdapter extends CursorAdapter { @Override public View newView(Conte ...
- Hadoop之HDFS文件操作
摘要:Hadoop之HDFS文件操作常有两种方式.命令行方式和JavaAPI方式.本文介绍怎样利用这两种方式对HDFS文件进行操作. 关键词:HDFS文件 命令行 Java API HD ...
- POJ 2750 Potted Flower(线段树+dp)
题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ...
- POJ 1182 食物链(并查集)
题目链接 经过宝哥的讲解,终于对这种问题有了进一步的理解.根据flag[x]和flag[y]求flag[tx]是最关键的了. 0吃1,1吃2,2吃0. 假设flag[tx] = X; 那么X + fl ...
- filename extension
题目描述 Please create a function to extract the filename extension from the given path,return the extra ...
- linux下lk和kernel层通信方式[2]
U-Boot与Linux内核的交互 说明:本文所使用的U-Boot的版本是1.1.6,平台是S3C2440. 目录 一.简介 1.1标记列表二.设置标记存放的地址 2.1相关的结构体定义 2.2标记存 ...
- hrtimer高精度定时器的简单使用【学习笔记】
#include <linux/module.h> #include <linux/kernel.h> #include <linux/hrtimer.h> #in ...
- java邮件发送(含附件)
1. [代码]java邮件发送(含附件)疯狂的IT人站长整理的:利用Java发送邮件(含附件)的例子:1.邮件发送的配置propertity文件内容如下:(utils.properties文件放在sr ...