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) { ...
随机推荐
- mysql数据出现Unknown column 'user_uid' in 'field list' sql错误
来源:https://blog.csdn.net/gnail_oug/article/details/53606608 在操作mysql数据库时提示com.mysql.jdbc.exceptions. ...
- 0302-对IT行业的感思
在参考并分析了2014行业排名和IT行业的就业分析后,给我的第一体会就是:如今的IT行业,是一个机会与挑战并存的行业. 先说机会. 从行业排行相关资料不难看出,现在是一个信息与大数据引领一切的时代,电 ...
- mac下mongoDB的使用
第一步: 我们在网上找到mongoDB的安装文件包,下载下来然后放在mac系统的指定位置,如图所示: 第二步:打开数据库服务端 我们在bin目录下执行mongod这个命令: 首先cd到bin目录 然后 ...
- [OSChina]VirtualBox 6.0.0 发布,改进对高端显示器的 HiDPI 支持--尝试一下
VirtualBox 6.0.0 发布,改进对高端显示器的 HiDPI 支持 https://www.oschina.net/news/102838/virtualbox-6-0-0-released ...
- Rabbitmq基本原理(转)
https://www.cnblogs.com/jun-ma/p/4840869.html
- #LOJ2564 SDOI2018 原题识别 主席树
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/9057297.html 原题链接: 今天考试考了前天的SDOI考题 天啊我菜爆,只有T2拿了30分 然后考试后半 ...
- Educational Codeforces Round 38 (Rated for Div. 2) C
C. Constructing Tests time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 【刷题】BZOJ 2287 【POJ Challenge】消失之物
Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. "要使用剩下的 N - 1 物品装满容积为 x ...
- 主机 & 虚拟机 & 开发板 相互通信
@2018年7月10日 成功方法之一: 虚拟机设置为桥接模式,保证三者在同一网段,ping方式测试网络连通性OK
- 【转】汽车CAN总线
概述 CAN(Controller Area Network)总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线,它起初用于实现汽车内ECU之间可靠的通信,后因其简单实用可靠等特点,而 ...