D. Magic Gems(矩阵快速幂 || 无敌杜教)
https://codeforces.com/contest/1117/problem/D
题解:有一些魔法宝石,魔法宝石可以分成m个普通宝石,每个宝石(包括魔法宝石)占用1个空间,让你求占用n个空间的方法有几种,有不同数量的魔法宝石和不同分法的方法算不同的方法,
分析:根据一些猜想可以推出递推式f[n]=f[n-1]+f[n-m] ; 答案也比较好猜想,牺牲一个然后分解 m 个
然后就是简单的构造矩阵快速幂
或者使用无敌杜教
这里给出点杜教心得 , 有时候并不是只用给出8项 , 而是给的数据越多 , 答案越正确 , 所以有时候用杜教不过就考虑给许多许多项杜教 , 可以在时间运行下的极限
矩阵快速幂
#include<stdio.h>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
typedef vector<ll>vec;
typedef vector<vec>mat; const int M = ;
ll n;int m;
int V;
mat mul(mat &A , mat &B)
{
mat C(A.size() , vec(B.size()));
for(int i= ; i<A.size() ; i++)
{
for(int k= ; k<B.size() ; k++)
{
if(A[i][k]==)
continue;
for(int j= ; j<B[].size() ; j++)
{
if(B[k][j]==)
continue;
C[i][j] = (C[i][j]%M+A[i][k]*B[k][j]%M)%M;
}
}
}
return C;
}
mat pow(mat A,ll n)
{
mat B(A.size(),vec(A.size()));
for(int i= ; i<A.size() ; i++)
B[i][i]=; while(n>)
{
if(n&)
B = mul(B,A);
A = mul(A,A);
n >>= ;
}
return B;
}
void so( )
{
mat A(m,vec(m));///构造矩阵
// A[0][0]=1;A[0][1]=2;A[0][2]=1;A[0][3]=0;A[0][4]=0;A[0][5]=0;
// A[1][0]=1;A[1][1]=0;A[1][2]=0;A[1][3]=0;A[1][4]=0;A[1][5]=0;
// A[2][0]=0;A[2][1]=0;A[2][2]=1;A[2][3]=3;A[2][4]=3;A[2][5]=1;
// A[3][0]=0;A[3][1]=0;A[3][2]=0;A[3][3]=1;A[3][4]=2;A[3][5]=1;
// A[4][0]=0;A[4][1]=0;A[4][2]=0;A[4][3]=0;A[4][4]=1;A[4][5]=1;
// A[5][0]=0;A[5][1]=0;A[5][2]=0;A[5][3]=0;A[5][4]=0;A[5][5]=1;
//printf("520");
for(int i= ; i<m ; i++)
for(int j= ; j<m ; j++)
A[i][j]=;
A[][]=;A[][m-]=;
for(int i= ; i<m ; i++)
A[i][i-]=; A = pow(A,n-m+);///第m项没有算哦
ll ans=;
for(int i= ; i<m ; i++)
{ ans=(ans+A[][i]+M)%M; } printf("%lld\n",(ans+M)%M); } int main()
{ scanf("%lld%d",&n,&m); so(); return ;
}
牛逼杜教
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=;
ll powmod(ll a,ll b)
{
ll res=;
a%=mod;
assert(b>=);
for(; b; b>>=)
{
if(b&)res=res*a%mod;
a=a*a%mod;
}
return res;
}
ll _,n;
namespace linear_seq
{
const int N=;
ll res[N],base[N],_c[N],_md[N];
vector<ll> Md;
void mul(ll *a,ll *b,int k)
{
rep(i,,k+k) _c[i]=;
rep(i,,k) if (a[i]) rep(j,,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
for (int i=k+k-; i>=k; i--) if (_c[i])
rep(j,,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
rep(i,,k) a[i]=_c[i];
}
int solve(ll n,VI a,VI b)
{
ll ans=,pnt=;
int k=SZ(a);
assert(SZ(a)==SZ(b));
rep(i,,k) _md[k--i]=-a[i];
_md[k]=;
Md.clear();
rep(i,,k) if (_md[i]!=) Md.push_back(i);
rep(i,,k) res[i]=base[i]=;
res[]=;
while ((1ll<<pnt)<=n) pnt++;
for (int p=pnt; p>=; p--)
{
mul(res,res,k);
if ((n>>p)&)
{
for (int i=k-; i>=; i--) res[i+]=res[i];
res[]=;
rep(j,,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
}
}
rep(i,,k) ans=(ans+res[i]*b[i])%mod;
if (ans<) ans+=mod;
return ans;
}
VI BM(VI s)
{
VI C(,),B(,);
int L=,m=,b=;
rep(n,,SZ(s))
{
ll d=;
rep(i,,L+) d=(d+(ll)C[i]*s[n-i])%mod;
if (d==) ++m;
else if (*L<=n)
{
VI T=C;
ll c=mod-d*powmod(b,mod-)%mod;
while (SZ(C)<SZ(B)+m) C.pb();
rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
L=n+-L;
B=T;
b=d;
m=;
}
else
{
ll c=mod-d*powmod(b,mod-)%mod;
while (SZ(C)<SZ(B)+m) C.pb();
rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
++m;
}
}
return C;
}
int gao(VI a,ll n)
{
VI c=BM(a);
c.erase(c.begin());
rep(i,,SZ(c)) c[i]=(mod-c[i])%mod;
return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
}
};
ll f[];
int main()
{
ll n,m;
scanf("%lld%lld",&n,&m);
for(int i=;i<=m;i++) f[i]=;
for(int i=m;i<=;i++)
f[i]=(f[i-]+f[i-m])%mod;
vector<int>v;
n++;
for(int i=;i<=;i++)
v.push_back(f[i]); //至少8项,越多越好。
printf("%lld\n",linear_seq::gao(v,n-)%mod);
}
D. Magic Gems(矩阵快速幂 || 无敌杜教)的更多相关文章
- eduCF#60 D. Magic Gems /// 矩阵快速幂
题目大意: 给定n m (1≤N≤1e18, 2≤M≤100) 一个魔法水晶可以分裂成连续的m个普通水晶 求用水晶放慢n个位置的方案modulo 1000000007 (1e9+7) input 4 ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- [递推+矩阵快速幂]Codeforces 1117D - Magic Gems
传送门:Educational Codeforces Round 60 – D 题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...
- Educational Codeforces Round 60 (Rated for Div. 2) D. Magic Gems(矩阵快速幂)
题目传送门 题意: 一个魔法水晶可以分裂成m个水晶,求放满n个水晶的方案数(mol1e9+7) 思路: 线性dp,dp[i]=dp[i]+dp[i-m]; 由于n到1e18,所以要用到矩阵快速幂优化 ...
- poj 2888 Magic Bracelet(Polya+矩阵快速幂)
Magic Bracelet Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 4990 Accepted: 1610 D ...
- ZZNU 2182 矩阵dp (矩阵快速幂+递推式 || 杜教BM)
题目链接:http://47.93.249.116/problem.php?id=2182 题目描述 河神喜欢吃零食,有三种最喜欢的零食,鱼干,猪肉脯,巧克力.他每小时会选择一种吃一包. 不幸的是,医 ...
- HDU4887_Endless Punishment_BSGS+矩阵快速幂+哈希表
2014多校第一题,当时几百个人交没人过,我也暴力交了几发,果然不行. 比完了去学习了BSGS才懂! 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4887 ...
- HDU 5171 GTY's birthday gift 矩阵快速幂
GTY's birthday gift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- ACM-ICPC 2018 焦作赛区网络预赛 L Poor God Water(矩阵快速幂,BM)
https://nanti.jisuanke.com/t/31721 题意 有肉,鱼,巧克力三种食物,有几种禁忌,对于连续的三个食物:1.这三个食物不能都相同:2.若三种食物都有的情况,巧克力不能在中 ...
随机推荐
- Visual Studio + C# + Xamarin = iOS/Android/Windows Apps
Visual Studio 跨平台開發實戰 (1) -- Hello Xamarin! 前言 應用程式發展的腳步,從來沒有停過.從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再 ...
- xml解析中的DOM和SAX的区别
面试题:DMO和SAX的区别? DOM解析的优点:增删查改操作方便,缺点:占用内存较大,不适合解析大的XML文件: SAX解析的优点:占用内存小,解析快:缺点:不适合增删查改:
- DB2 函数快速构造测试数据
函数快速构造测试数据 [案例]使用DB2内置函数快速构造测试数据 无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习 SQL,您都需要在您的应用程序上运行测试数据.为了有效地测试应 ...
- android 仿QQ气泡聊天界面
1.现在的QQ,微信等一些APP的聊天界面都是气泡聊天界面,左边是接收到的消息,右边是发送的消息, 这个效果其实就是一个ListView在加载它的Item的时候,分别用了不同的布局xml文件. 2.效 ...
- 微软和Google的盈利模式对比分析
一: 微软和Google是世界上最成功科技巨头之一,但他们之间却有着不同的产品和业务,二者的盈利方式也各有不同,本文将分析和探讨的二者盈利模式的异同. 微软的盈利模式 在1975年由大学肄业的Bill ...
- C# 微信openid 用户信息
前段demo index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- arp欺骗进行流量截获-2
上一篇讲了原理,那么这一篇主要讲如何实现.基本上也就是实现上面的两个步骤,这里基于gopacket实现,我会带着大家一步步详细把每个步骤都讲到. ARP 欺骗 首先就是伪造ARP请求,让A和B把数据包 ...
- javascript ie8兼容 a标签href javascript:void(0);
ie8兼容 a标签href javascript:void(0); 尽量不要用javascript:协议做为A的href属性,这样不仅会导致不必要的触发window.onbeforeunload事件;
- .net core .NET Core与.NET Framework、Mono之间的关系
.NET Core与.NET Framework.Mono之间的关系 首先想要知道.NET Core与.NET Framework.Mono之间的关系,就必须他们分别是什么,有什么用途? 一. .ne ...
- MultiDataTrigger
MultiDataTrigger是多条件数据触发器 和MltiTrigger是同样的,只不过前者是数据,后者是属性. 这个是基本的使用语法 <MultiDataTrigger> <M ...