HDU 6395 Sequence 杜教板子题
题目意思非常明确,就是叫你求第n项,据我们学校一个大佬说他推出了矩阵,但是我是菜鸡,那么肯定是用简单的方法水过啦!我们先p^(1/2)的复杂度处理出i=[i,p]范围内的所有种类的(int)(p/i),然后我们就可以知道种可能的除数的范围,就是分成几块
这里我不太会表达,看代码比较好
- /**
- 求n/i的所有结果
- **/
- #include<stdio.h>
- int main( ){
- int n;
- scanf("%d", &n);
- long long nex;
- for(long long i=; i<=n; i=nex+){
- nex=n/(n/i);
- printf("%I64d, %I64d\n", n/i, nex);
- /**
- n/i保存到数组里从小到大排序,你们就知道块是按这个分的了
- **/
- /**
- 看一下输出之类的应该能发现就是类似于
- int n;
- vector<int> V;
- scanf("%d", &n);
- for(int i=1; i<=n; ++i){
- V.push_back((n/i));
- }
- ......数组去重
- 会发现这就是n/i的所有结果
- **/
- }
- }
对这些分出来的块我们判断一下,如果两块之间距离很小,那么就没必要用杜教板子推第n项;直接暴力;
其他的就加入该块的前几个元素去推;
具体看恶心的代码
- #include<bits/stdc++.h>
- using namespace std;
- #define rep(i,a,n) for (int i=a;i<n;i++)
- #define pb push_back
- #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;}
- int _, n;
- namespace linear_seq {
- const int N=;
- ll res[N],base[N],_c[N],_md[N];
- vector<int> 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) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
- // printf("%d\n",SZ(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 sav[], ans[];
- int main(){
- int T;
- register int i, j;
- ll c, d, p, num, nex, top, a, b;
- scanf("%d", &T);
- while(T--){
- vector<int> v;
- scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &ans[], &ans[], &c, &d, &p, &num);
- a=ans[];
- b=ans[];
- top=;
- if(num<){
- if(num<=){
- printf("%I64d\n", ans[num]);
- continue;
- }
- for(i=; i<=num; ++i){
- ans[]=(c*ans[]%mod+d*ans[]%mod+(p/i))%mod;
- ans[]=ans[];
- ans[]=ans[];
- }
- printf("%I64d\n", ans[]);
- continue;
- }
- for(i=; i<=p; i=nex+){
- nex=p/(p/i);
- sav[top++]=(p/i);
- }
- for(i=; i<=top/; ++i){
- swap(sav[i], sav[top-i-]);
- }
- sav[top]=num;
- 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]]半开半闭区间
- ans[]=ans[];
- ans[]=ans[];
- for(i=; i<top; ++i){
- if(sav[i+]>=num){
- if(num-sav[i]<=){
- for(j=sav[i]+; j<=num; ++j){
- ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
- ans[]=ans[];
- ans[]=ans[];
- }
- printf("%I64d\n", ans[]);
- break;
- }else{
- v.clear();
- for(j=sav[i]+; j<=sav[i]+; ++j){
- ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
- v.push_back((int)ans[]);
- ans[]=ans[];
- ans[]=ans[];
- }
- n=num-sav[i];
- printf("%d\n", linear_seq::gao(v, n-));
- break;
- }
- }else if(sav[i+]-sav[i]<=){
- for(j=sav[i]+; j<=sav[i+]; ++j){
- ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
- ans[]=ans[];
- ans[]=ans[];
- }
- }else{
- v.clear();
- for(j=sav[i]+; j<=sav[i]+; ++j){
- ans[]=(c*ans[]%mod+d*ans[]%mod+(p/j))%mod;
- v.push_back((int)ans[]);
- ans[]=ans[];
- ans[]=ans[];
- }
- n=sav[i+]-sav[i];
- ans[]=linear_seq::gao(v, n-);///这里还不是结束,也就是要至少保留连续的两项
- ans[]=linear_seq::gao(v, n-);
- }
- }
- }
- }
代码
HDU 6395 Sequence 杜教板子题的更多相关文章
- HDU 6395 Sequence 【矩阵快速幂 && 暴力】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 1232 并查集板子题
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- [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== ...
- HDU 5608 function [杜教筛]
HDU 5608 function 题意:数论函数满足\(N^2-3N+2=\sum_{d|N} f(d)\),求前缀和 裸题-连卷上\(1\)都告诉你了 预处理\(S(n)\)的话反演一下用枚举倍数 ...
- HDU 1711Number Sequence【KMP模板题】
<题目链接> 题目大意: 意思是给出两个串,找出匹配串在模式串中的位置. 解题分析: KMP算法模板题. #include <cstdio> #include <cstr ...
- hdu 6395 Sequence (简单矩乘)
P/n大多数情况是不变的, 取值只有$O(\sqrt{P})$种, 可以用$p/(p/i)$跳过重复的值, 复杂度$O(logn\sqrt{P})$ 要注意 P跟模数P有冲突 要特判p/i==0和p/ ...
- HDU - 6395 Sequence (分块+快速矩阵幂)
给定递推式: 求Fn. 分析:给出的公式可以用快速矩阵幂运算得到,但 P/n 整除对于不同的i,值是不同的. 可以根据P将3-n分成若干块,每块中P整除n的值是相同的.分块的时候要注意判断. 将每块的 ...
- HDU - 6395 Sequence (整除分块+矩阵快速幂)
定义数列: $\left\{\begin{eqnarray*} F_1 &=& A \\ F_2 &=& B \\ F_n &=& C\cdot{}F_ ...
- 畅通工程 HDU - 1232 并查集板子题
#include<iostream> #include<cstring> using namespace std; ; int p[N]; int find(int x) { ...
随机推荐
- 【SE】Week1 : 个人博客作业
快速看完整部教材,列出你不懂的 5 - 10 个问题,发布在你的个人博客上. 1)针对书中提到的NABCD模型中的N,如何发掘市场不明确的潜在用户需求? 2)PM是否负责团队职责的分配以及工程模块的设 ...
- 11慕课网《进击Node.js基础(一)》Buffer和Stream
Buffer 用来保存原始数据 (logo.png) 以下代码读取logo.png为buffer类型 然后将buffer转化为string,新建png 可以将字符串配置: data:image/png ...
- What is the difference between WinRT, UWP and WPF?
在学习UWP的过程中确实有这个迷惑,在此分享一下. UWP (Universal Windows platform), Metro and WinRT are all result of Micros ...
- C++的OOP特性
内存模型和名称空间 存储持续性,作用域和链接性 C++有三种方案来存储数据 自动存储持续性:在函数定义中声明的变量,包括函数参数.在函数或代码块开始执行时创建.执行完函数或者代码块,内存自动释放. 静 ...
- [Cyan之旅]使用NPOI实现Excel的导入导出,踩坑若干.
Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 POI 项目的 .NET 版本.POI是一个开源 ...
- 3D舞台实现
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C语言入门:03.关键字、标识符、注释
一.学习语法之前的提醒 (1)C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 (2)就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头,只 ...
- 详细理解servlet实现的三种方式和生命周期
阅读目录 开发servlet的三种方式 理解实现servlet接口的方式,理解servlet生命周期 Servlet接口有五个方法 继承GenericServlet 继承HttpServlet 现在很 ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
- 一个具有缓存数据功能的HttpWebRequest工具类
背景:一个公共站点中的数据,供其它子站点共享,为了提高性能,简单实现了Http 1.1的缓存功能 特点:可以缓存Html数据到内存中;缓存具有过期时间;缓存过期后,通过再确认的方式来决定是否更新缓存; ...