题目意思非常明确,就是叫你求第n项,据我们学校一个大佬说他推出了矩阵,但是我是菜鸡,那么肯定是用简单的方法水过啦!我们先p^(1/2)的复杂度处理出i=[i,p]范围内的所有种类的(int)(p/i),然后我们就可以知道种可能的除数的范围,就是分成几块

这里我不太会表达,看代码比较好

  1. /**
  2. 求n/i的所有结果
  3. **/
  4. #include<stdio.h>
  5. int main( ){
  6. int n;
  7. scanf("%d", &n);
  8. long long nex;
  9. for(long long i=; i<=n; i=nex+){
  10. nex=n/(n/i);
  11. printf("%I64d, %I64d\n", n/i, nex);
  12. /**
  13. n/i保存到数组里从小到大排序,你们就知道块是按这个分的了
  14. **/
  15. /**
  16. 看一下输出之类的应该能发现就是类似于
  17. int n;
  18. vector<int> V;
  19. scanf("%d", &n);
  20. for(int i=1; i<=n; ++i){
  21. V.push_back((n/i));
  22. }
  23. ......数组去重
  24. 会发现这就是n/i的所有结果
  25.  
  26. **/
  27. }
  28. }

对这些分出来的块我们判断一下,如果两块之间距离很小,那么就没必要用杜教板子推第n项;直接暴力;

其他的就加入该块的前几个元素去推;

具体看恶心的代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define rep(i,a,n) for (int i=a;i<n;i++)
  4. #define pb push_back
  5. #define SZ(x) ((int)(x).size())
  6. typedef vector<int> VI;
  7. typedef long long ll;
  8. typedef pair<int,int> PII;
  9. const ll mod=;
  10. 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;}
  11. int _, n;
  12. namespace linear_seq {
  13. const int N=;
  14. ll res[N],base[N],_c[N],_md[N];
  15. vector<int> Md;
  16. void mul(ll *a,ll *b,int k) {
  17. rep(i,,k+k) _c[i]=;
  18. rep(i,,k) if (a[i]) rep(j,,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
  19. for (int i=k+k-;i>=k;i--) if (_c[i])
  20. rep(j,,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
  21. rep(i,,k) a[i]=_c[i];
  22. }
  23. int solve(ll n,VI a,VI b) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
  24. // printf("%d\n",SZ(b));
  25. ll ans=,pnt=;
  26. int k=SZ(a);
  27. assert(SZ(a)==SZ(b));
  28. rep(i,,k) _md[k--i]=-a[i];_md[k]=;
  29. Md.clear();
  30. rep(i,,k) if (_md[i]!=) Md.push_back(i);
  31. rep(i,,k) res[i]=base[i]=;
  32. res[]=;
  33. while ((1ll<<pnt)<=n) pnt++;
  34. for (int p=pnt;p>=;p--) {
  35. mul(res,res,k);
  36. if ((n>>p)&) {
  37. for (int i=k-;i>=;i--) res[i+]=res[i];res[]=;
  38. rep(j,,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
  39. }
  40. }
  41. rep(i,,k) ans=(ans+res[i]*b[i])%mod;
  42. if (ans<) ans+=mod;
  43. return ans;
  44. }
  45. VI BM(VI s) {
  46. VI C(,),B(,);
  47. int L=,m=,b=;
  48. rep(n,,SZ(s)) {
  49. ll d=;
  50. rep(i,,L+) d=(d+(ll)C[i]*s[n-i])%mod;
  51. if (d==) ++m;
  52. else if (*L<=n) {
  53. VI T=C;
  54. ll c=mod-d*powmod(b,mod-)%mod;
  55. while (SZ(C)<SZ(B)+m) C.pb();
  56. rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
  57. L=n+-L; B=T; b=d; m=;
  58. } else {
  59. ll c=mod-d*powmod(b,mod-)%mod;
  60. while (SZ(C)<SZ(B)+m) C.pb();
  61. rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
  62. ++m;
  63. }
  64. }
  65. return C;
  66. }
  67. int gao(VI a,ll n) {
  68. VI c=BM(a);
  69. c.erase(c.begin());
  70. rep(i,,SZ(c)) c[i]=(mod-c[i])%mod;
  71. return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
  72. }
  73. };
  74. ll sav[], ans[];
  75. int main(){
  76. int T;
  77. register int i, j;
  78. ll c, d, p, num, nex, top, a, b;
  79. scanf("%d", &T);
  80. while(T--){
  81. vector<int> v;
  82. scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &ans[], &ans[], &c, &d, &p, &num);
  83. a=ans[];
  84. b=ans[];
  85. top=;
  86. if(num<){
  87. if(num<=){
  88. printf("%I64d\n", ans[num]);
  89. continue;
  90. }
  91. for(i=; i<=num; ++i){
  92. ans[]=(c*ans[]%mod+d*ans[]%mod+(p/i))%mod;
  93. ans[]=ans[];
  94. ans[]=ans[];
  95. }
  96. printf("%I64d\n", ans[]);
  97. continue;
  98. }
  99. for(i=; i<=p; i=nex+){
  100. nex=p/(p/i);
  101. sav[top++]=(p/i);
  102. }
  103. for(i=; i<=top/; ++i){
  104. swap(sav[i], sav[top-i-]);
  105. }
  106. sav[top]=num;
  107. ans[]=(c*ans[]%mod+d*ans[]%mod+(p/))%mod;///这里处理是因为,在区间[sav[i], sav[i+1]]内sav[i]和[sav[i]+1, sav[i+1]]对p的除数是不同的;所以说第一次处理一下sav[i],就可以让区间变成(sav[i], sav[i+1]]半开半闭区间
  108. ans[]=ans[];
  109. ans[]=ans[];
  110. for(i=; i<top; ++i){
  111. if(sav[i+]>=num){
  112. if(num-sav[i]<=){
  113. for(j=sav[i]+; j<=num; ++j){
  114. ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
  115. ans[]=ans[];
  116. ans[]=ans[];
  117. }
  118. printf("%I64d\n", ans[]);
  119. break;
  120. }else{
  121. v.clear();
  122. for(j=sav[i]+; j<=sav[i]+; ++j){
  123. ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
  124. v.push_back((int)ans[]);
  125. ans[]=ans[];
  126. ans[]=ans[];
  127. }
  128. n=num-sav[i];
  129. printf("%d\n", linear_seq::gao(v, n-));
  130. break;
  131. }
  132. }else if(sav[i+]-sav[i]<=){
  133. for(j=sav[i]+; j<=sav[i+]; ++j){
  134. ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
  135. ans[]=ans[];
  136. ans[]=ans[];
  137. }
  138. }else{
  139. v.clear();
  140. for(j=sav[i]+; j<=sav[i]+; ++j){
  141. ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
  142. v.push_back((int)ans[]);
  143. ans[]=ans[];
  144. ans[]=ans[];
  145. }
  146. n=sav[i+]-sav[i];
  147. ans[]=linear_seq::gao(v, n-);///这里还不是结束,也就是要至少保留连续的两项
  148. ans[]=linear_seq::gao(v, n-);
  149. }
  150. }
  151. }
  152. }

代码

HDU 6395 Sequence 杜教板子题的更多相关文章

  1. HDU 6395 Sequence 【矩阵快速幂 && 暴力】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others)   ...

  2. HDU 1232 并查集板子题

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  3. [51Nod 1244] - 莫比乌斯函数之和 & [51Nod 1239] - 欧拉函数之和 (杜教筛板题)

    [51Nod 1244] - 莫比乌斯函数之和 求∑i=1Nμ(i)\sum_{i=1}^Nμ(i)∑i=1N​μ(i) 开推 ∑d∣nμ(d)=[n==1]\sum_{d|n}\mu(d)=[n== ...

  4. HDU 5608 function [杜教筛]

    HDU 5608 function 题意:数论函数满足\(N^2-3N+2=\sum_{d|N} f(d)\),求前缀和 裸题-连卷上\(1\)都告诉你了 预处理\(S(n)\)的话反演一下用枚举倍数 ...

  5. HDU 1711Number Sequence【KMP模板题】

    <题目链接> 题目大意: 意思是给出两个串,找出匹配串在模式串中的位置. 解题分析: KMP算法模板题. #include <cstdio> #include <cstr ...

  6. hdu 6395 Sequence (简单矩乘)

    P/n大多数情况是不变的, 取值只有$O(\sqrt{P})$种, 可以用$p/(p/i)$跳过重复的值, 复杂度$O(logn\sqrt{P})$ 要注意 P跟模数P有冲突 要特判p/i==0和p/ ...

  7. HDU - 6395 Sequence (分块+快速矩阵幂)

    给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...

  8. HDU - 6395 Sequence (整除分块+矩阵快速幂)

    定义数列: $\left\{\begin{eqnarray*} F_1 &=& A \\ F_2 &=& B \\ F_n &=& C\cdot{}F_ ...

  9. 畅通工程 HDU - 1232 并查集板子题

    #include<iostream> #include<cstring> using namespace std; ; int p[N]; int find(int x) { ...

随机推荐

  1. 【SE】Week1 : 个人博客作业

    快速看完整部教材,列出你不懂的 5 - 10 个问题,发布在你的个人博客上. 1)针对书中提到的NABCD模型中的N,如何发掘市场不明确的潜在用户需求? 2)PM是否负责团队职责的分配以及工程模块的设 ...

  2. 11慕课网《进击Node.js基础(一)》Buffer和Stream

    Buffer 用来保存原始数据 (logo.png) 以下代码读取logo.png为buffer类型 然后将buffer转化为string,新建png 可以将字符串配置: data:image/png ...

  3. What is the difference between WinRT, UWP and WPF?

    在学习UWP的过程中确实有这个迷惑,在此分享一下. UWP (Universal Windows platform), Metro and WinRT are all result of Micros ...

  4. C++的OOP特性

    内存模型和名称空间 存储持续性,作用域和链接性 C++有三种方案来存储数据 自动存储持续性:在函数定义中声明的变量,包括函数参数.在函数或代码块开始执行时创建.执行完函数或者代码块,内存自动释放. 静 ...

  5. [Cyan之旅]使用NPOI实现Excel的导入导出,踩坑若干.

    Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 POI 项目的 .NET 版本.POI是一个开源 ...

  6. 3D舞台实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. C语言入门:03.关键字、标识符、注释

    一.学习语法之前的提醒 (1)C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 (2)就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头,只 ...

  8. 详细理解servlet实现的三种方式和生命周期

    阅读目录 开发servlet的三种方式 理解实现servlet接口的方式,理解servlet生命周期 Servlet接口有五个方法 继承GenericServlet 继承HttpServlet 现在很 ...

  9. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

  10. 一个具有缓存数据功能的HttpWebRequest工具类

    背景:一个公共站点中的数据,供其它子站点共享,为了提高性能,简单实现了Http 1.1的缓存功能 特点:可以缓存Html数据到内存中;缓存具有过期时间;缓存过期后,通过再确认的方式来决定是否更新缓存; ...