题目链接:http://www.ycoj.cf/problem/14
题目大意:n个大臣进贡的黄金都是[1,m]内的正整数。若后一个大臣的黄金数是后一个人的倍数,那么这个人就会受罚。因此他希望你能帮他求出有多少种进贡黄金的方案,不存在一个大臣进贡的黄金恰好是前一个大臣进贡黄金的倍数。两种方案不同当且仅当存在x使得第x个进贡的大臣在两种方案中进贡了的黄金数量不同。
题目分析:
一:如果用f[i][j]表示,第i个大臣进贡j的黄金的方案数。那么f[i][j]=∑f[i-1][k](j%k!=0),其实可以转化为:f[i][j]=∑f[i-1][k](m>=k>=1)-∑f[i-1][k](j%k==0)
二:由于所有的质数在n==1时,f的值为1,那么因为f[i][j]只与j的因数有关,那么我们将一个数分解质因数后可以发现,如果质因数的指数从大到小排序后,两个数的质因数指数分别相等,那么他们的f值是相同的,因为都是由同样数量质数转移而来的。所以我们只需要处理好质数的组合情况就行了。
三:分析时间复杂度后我们发现,只有当时间复杂度在O(nlogm)左右时才可以通过题目。我们通过打表可以发现,指数组合仅只有不到200种可能性。那么就可以通过矩阵二分快速幂来实现这个过程,降低时间复杂度,最后时间复杂度大致为O(200^3logn),可以通过题目。
四:在处理指数组合的时候可以用哈希表来处理。
解题过程:
一:用哈希表处理处每个指数组合,并记录每个组合出现的次数。
二:根据1~m的数之间的整除关系来构造矩阵,矩阵i,j表示组合i–>组合j的转移方案数。
三:利用矩阵二分快速幂迅速得到答案。
最后附上AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>using namespace std;
typedef int ll;
ll N,m,P;
ll d[300010],pos[300010];
ll type[210],tot=0;
ll Pri[]={2,3,5,7,11,13,17,19},tp[300010];
void getMax()
{ll count1=1;for(ll i=2;i<=m;++i){if(!d[i])d[i]=tp[++count1]=i;ll u=min(m/i,d[i]);for(ll j=1;j<=count1 && tp[j]<=u;++j)d[i*tp[j]]=tp[j];}
}
bool cmp(ll a,ll b)
{return a>b;
}
ll mapping(ll x)
{ll C[20],T=0;while(x!=1){ll p=d[x];C[T]=0;while(d[x]==p)x/=p,++C[T];++T;}sort(C,C+T,cmp);ll ans=1,p,c;while(T--)for(p=Pri[T],c=C[T];c--;)ans*=p;if(pos[ans]==-1){pos[ans]=tot++;type[pos[ans]]=ans;}return pos[ans];
}
ll cnt[210];
struct matrix
{ll n;ll a[210][210];
};
matrix matrix_mul(matrix A, matrix B)
{matrix ret;ret.n = A.n;for(ll i=0;i<ret.n;i++)for(ll j=0;j<ret.n;j++)ret.a[i][j]=0;for(ll i=0;i<ret.n;i++)for(ll j=0;j<ret.n;j++)for(ll k=0;k<A.n;k++)ret.a[i][j]=(ret.a[i][j]+A.a[i][k]*(long long)B.a[k][j]%P)%P;return ret;
}
matrix unit(ll n)
{matrix ret;ret.n=n;for(ll i=0;i<n;i++){for(ll j=0;j<n;j++){if(i==j)ret.a[i][j]=1;elseret.a[i][j]=0;}}return ret;
}
void matrix_pow(matrix A,ll p,matrix &V)
{while(p){if(p&1)V=matrix_mul(V,A);A=matrix_mul(A,A);p>>=1;}
}
ll num[100010];
int main()
{memset(pos,-1,sizeof(pos));scanf("%d%d%d",&N,&m,&P);getMax();for(ll i=1;i<=m;i++){num[i]=mapping(i);cnt[num[i]]++;}matrix M,V;M.n=tot;for(ll i=0;i<tot;++i)for(ll j=0;j<tot;++j)M.a[i][j]=cnt[i];V.n=tot;for(ll i=0;i<tot;i++)V.a[0][i]=1;for(ll i=0;i<tot;i++){ll x=type[i];for(ll f=1;f*f<=x;++f){if(x%f==0){if(num[f]!=0)--M.a[num[f]][i];else{num[f]=mapping(f);--M.a[num[f]][i];}if(f*f!=x){if(num[x/f]!=0)--M.a[num[x/f]][i];else{num[x/f]=mapping(f);--M.a[num[x/f]][i];}}}}}N--;matrix_pow(M,N,V);ll A=0;for(ll i=0;i<tot;i++)A=(A+cnt[i]*(long long)V.a[0][i])%P;printf("%d\n",A);return 0;
}

ZYS的黄金——解题报告相关推荐

  1. [TJOI2013]黄金矿工解题报告

    题目描述 小A最近迷上了在上课时玩<黄金矿工>这款游戏.为了避免被老师发现,他必须小心翼翼,因此他总是输.在输掉自己所有的金币后,他向你求助.每个黄金可以看做一个点(没有体积).现在给出你 ...

  2. 2016-11-17试题解题报告

    2016-11-17试题解题报告 By shenben 水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知 ...

  3. 久久未至的Codevs1024一塔湖图解题报告

    一直想给这个题写个解题报告但是给忘了OTZ难产了这么久终于出来了 这个题当时坑了我一个星期整,所以一定要写一个解题报告纪念一下 1024 一塔湖图 时间限制: 1 s 空间限制: 128000 KB ...

  4. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  5. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  6. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  7. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  9. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

最新文章

  1. linux下配置ip地址的方法
  2. R语言PCA主成分分析(Principle Component Analysis)实战1
  3. 什么是启发式?什么是产生式?
  4. php mysql 数据字典_php如何生成mysql数据字典
  5. Android Motion Stills实现AR即时运动捕捉
  6. 【j360-boot】Spring-boot系列三(崩溃模式,不是你崩就是电脑崩)
  7. UVA10359 Tiling【大数+递推】
  8. C# 设计模式 (一)
  9. android listview 只加载显示的图片大小,Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)...
  10. 【UVA11795】 Mega Man's Mission
  11. 16个外接SMA天线R2000超高频RFID写卡器HXU2899M上位机命令数据块
  12. 拼多多商家券和平台优惠券的相互叠加
  13. selenium chromedriver 无头浏览器检测
  14. pytorch复现RRU-Net
  15. failed to push some refs to 'https://e.coding.net/xxx/xxx.git fetch = +refs/heads/*:refs/
  16. [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
  17. Drill系列(1):Dremel的原理
  18. Elasticsearch7.×集群搭建,生命周期策略ilm_policy、索引模板template管理(二)
  19. MTCNN开源训练(PNet训练)
  20. android8手机 使用方法,技巧丨8条使用技巧, 让你手机更安全(安卓篇)!

热门文章

  1. 最小路径覆盖详解 超级详细(附带例题 Stock Charts(给了题目))
  2. Unity3D 游戏加密解密那些事
  3. java tea加密_TEA 加密解法,统一了C语言、Java与PHP的运算结果
  4. 电源管理芯片——AXP202
  5. Java 获取当前时间并且格式化
  6. 将逗号隔开的字符串String转换为list<T>集合
  7. Java面试时,你被深挖过什么问题?
  8. c语言file函数头文件,文件操作函数 C语言 (FILE fputc fgetc fputs fgets fsca...
  9. 线路板行业含铜废水处理,铜箔废水深度处理和铜回收
  10. hbase几种查询方式对比