【51nod】1602 矩阵方程的解
【51nod】1602 矩阵方程的解
这个行向量显然就是莫比乌斯函数啦,好蠢的隐藏方法= =
然后我们尝试二分,二分的话要求一个这个东西
\(H(n) = \sum_{i = 1}^{n} \mu(i) == d\)
当然\(\mu(x)\)由于一些很好的性质,这个东西可以用分类讨论做出来
众所周知,求\(\mu\)不为0的数的方法就是容斥求无平方因子数
\(G(n) = \sum_{i = 1}^{\sqrt{N}} \mu(i) \lfloor \frac{N}{i^{2}} \rfloor\)
这样我们已经可以快速求得\(\mu(i) = 0\)的位置有多少了,就是\(N - G(n)\)
再求一个\(F(n)\)作为莫比乌斯函数的前缀和,也就是1和-1的差值
可以用\(F(n)\)和\(G(n)\)和一点特判快速求出来1和-1的个数,显然\(F(n)\)需要的复杂度 远大于\(G(n)\),是\(O(n^{2/3})\)的
梦想选手快乐的写了一发,只过了d = 0的点,惨兮兮
然后经过努力的尝试,发现如果\(R - L < 10^{6}\)的时候停止二分,转而改为通过类似埃氏筛的方法暴力求这\(10^{6}\)个位置的mu函数,然后挨个枚举看看哪里是答案
这样的话可以在3s左右通过了
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 1000005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int prime[10000005],tot,mu[10000005],M[10000005];
int c[10000005];
int64 val[10000005];
bool nonprime[10000005];
struct hash {
struct node {
int64 x,val;int nxt;
}E[10000005];
int sumE,head[1000000],mo = 974711;
void add(int64 x,int64 v) {
int u = x % mo;
E[++sumE].x = x;
E[sumE].val = v;
E[sumE].nxt = head[u];
head[u] = sumE;
}
int64 Query(int64 x) {
int u = x % mo;
for(int i = head[u] ; i ; i = E[i].nxt) {
if(E[i].x == x) return E[i].val;
}
return -1e18;
}
}hsh;
map<int64,int64> zz;
int64 F(int64 n) {
if(n <= 10000000) return M[n];
//if(zz.count(n)) return zz[n];
int64 t = hsh.Query(n);
if(t > -1e18) return t;
int64 res = 1;
for(int64 i = 2 ; i <= n ; ++i) {
int64 r = n / (n / i);
res -= F(n / i) * (r - i + 1);
i = r;
}
//zz[n] =res;
hsh.add(n,res);
return res;
}
int64 G(int64 n) {
int64 ans = 0;
for(int64 i = 1 ; i <= n / i ; ++i) {
ans += 1LL * mu[i] * (n / (i * i));
}
return ans;
}
int getmu(int64 x) {
int r = 1;
for(int i = 1 ; prime[i] <= x / prime[i] ; ++i) {
if(x % prime[i] == 0) {
if(x % (prime[i] * prime[i]) == 0) return 0;
r = -r;
x /= prime[i];
}
}
if(x != 1) r = -r;
return r;
}
int64 check(int64 n,int d) {
int64 g = G(n);
if(d == 0) return n - g;
int64 f = F(n);
int64 t = (g - abs(f)) / 2;
if(d == -1 && f < 0) t += abs(f);
if(d == 1 && f > 0) t += f;
return t;
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
mu[1] = 1;M[1] = 1;
for(int i = 2 ; i <= 10000000 ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
mu[i] = -1;
}
for(int j = 1 ; j <= tot ; ++j) {
if(prime[j] > 10000000 / i) break;
nonprime[i * prime[j]] = 1;
if(i % prime[j] == 0) break;
else mu[i * prime[j]] = -mu[i];
}
M[i] = M[i - 1] + mu[i];
}
int64 d,k;
read(d);read(k);
int64 L = 1,R = 1e10;
while(R - L > 1e6) {
int64 mid = (L + R) >> 1;
int64 x = check(mid,d);
if(x >= k) R = mid - 2 * (x - k);
else L = mid + 2 * (k - x);
}
for(int i = 0 ; i <= R - L ; ++i) {c[i] = 1;val[i] = i + L;}
for(int i = 1 ; i <= tot ; ++i) {
if(1LL * prime[i] * prime[i] > R) break;
int64 l = ((L - 1)/ prime[i] + 1) * prime[i];
int64 r = (R / prime[i]) * prime[i];
for(int64 j = l - L ; j <= r - L ; j += prime[i]) {
if(!c[j]) continue;
if(val[j] % (1LL * prime[i] * prime[i]) == 0) c[j] = 0;
else {c[j] = -c[j];val[j] /= prime[i];}
}
}
int64 x = check(L - 1,d);
for(int i = 0 ; i <= R - L ; ++i) {
if(c[i] && val[i] != 1) c[i] = -c[i];
if(c[i] == d) ++x;
if(x == k) {out(i + L);enter;break;}
}
//printf("%.3lf\n",1.0 * clock() / CLOCKS_PER_SEC);
return 0;
}
【51nod】1602 矩阵方程的解的更多相关文章
- 【Python】Coding the Matrix:Week 5: Dimension Homework 5
这一周的作业,刚压线写完.Problem3 没有写,不想证明了.从Problem 9 开始一直到最后难度都挺大的,我是在论坛上看过了别人的讨论才写出来的,挣扎了很久. Problem 9在给定的基上分 ...
- 非线性方程(组):MATLAB内置函数 solve, vpasolve, fsolve, fzero, roots [MATLAB]
MATLAB函数 solve, vpasolve, fsolve, fzero, roots 功能和信息概览 求解函数 多项式型 非多项式型 一维 高维 符号 数值 算法 solve 支持,得到全部符 ...
- 使用python解线性矩阵方程(numpy中的matrix类)
这学期有一门运筹学,讲的两大块儿:线性优化和非线性优化问题.在非线性优化问题这里涉及到拉格朗日乘子法,经常要算一些非常变态的线性方程,于是我就想用python求解线性方程.查阅资料的过程中找到了一个极 ...
- 扩展欧几里德解的数量(51nod 1352)
题意:给出N,A,B:求A*x+ B*y = N+1 的大于0 的解的数量: 思路:先用exgcd求出大于0的初始解x,rest = N - x*A; sum = rest/LCM(A, B); ...
- POJ 3253 Fence Repair C++ STL multiset 可解 (同51nod 1117 聪明的木匠)
Fence Repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 53106 Accepted: 17508 De ...
- linux查看端口及端口详解
今天现场查看了TCP端口的占用情况,如下图 红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说E ...
- 51nod 1158 全是1的最大子矩阵
题目链接:51nod 1158 全是1的最大子矩阵 题目分类是单调栈,我这里直接用与解最大子矩阵类似的办法水过了... #include<cstdio> #include<cstri ...
- 《Linear Algebra and Its Applications》-chaper1-向量方程、矩阵方程和线性方程组
向量: 向量的基本运算:向量的运算最基本的一件事情,就是基于它n个分量上进行,即对于两个分量的向量a = <a1,a2>,b = <b1,b2>,有a + b = <a1 ...
- 高斯消元法(Gauss Elimination)【超详解&模板】
高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...
随机推荐
- 浅谈CLOSE_WAIT
浅谈CLOSE_WAIT 发表于2016-01-19 TCP 有很多连接状态,每一个都够聊十块钱儿的,比如我们以前讨论过 TIME_WAIT 和 FIN_WAIT1,最近时不时听人提起 CLOSE_W ...
- ZROI Day6比赛总结
比赛还没结束而且我没有参加比赛就来这里了. T1 略 T2 设\(ans_d\)表示\(d|b_i\)的方案数(最后反演一下就可以) 设\(d\not|a_i\)的个数为\(l\)(可以\(O(n\l ...
- 实现返回顶部-wepy小程序-前端梳理
<script type="text/javascript" src="http://hovertree.com/ziyuan/jquery/jquery-1.11 ...
- Redis Mysql 双写一致性问题
一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)- 先更新数据库,后更新 ...
- BP神经网络原理及在Matlab中的应用
一.人工神经网络 关于对神经网络的介绍和应用,请看如下文章 神经网络潜讲 如何简单形象又有趣地讲解神经网络是什么 二.人工神经网络分类 按照连接方式--前向神经网络.反馈(递归)神经网络 按照 ...
- Beyond compare4密钥
w4G-in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwfXv5n0IHDp5hv1BM3+H1XygMtiE0-JBgacjE9tz33sIh542EmsGs1yg6 ...
- 搭建docusaurus博客
搭建docusaurus博客: docusaurus是facebook的开源的用于简化构建,部署,和维护的博客网站. 特点: 快速启动 支持本地化 页面可自定义 安装要求: Node >= 8. ...
- 在使用avalon框架的时候,用ms-duplex双工绑定,在template上是有数据渲染的,但是js里面却是undefined
controller绑定是用于圈定某个VM的作用域范围,因为有的页面,你用的对象一致,而这两个作用域里面有相同的数据,那么很有可能是另一个作用域里面的东西影响了这个作用域,所以在指定作用域的给不同的命 ...
- mapper @Select()注解开发,使用模板 if 和循环
if @Select({"<script>", "SELECT " + " mu.id userId, " + " e ...
- 咏南中间件新增MORMOT插件功能
咏南中间件新增MORMOT插件功能 咏南中间件支持DATASNAP和MORMOT两种通讯框架. 原来已经支持DATASNAP插件,现在又增加了MORMOT插件,已经支持DATASNAP和MORMOT两 ...