BZOJ 1407 exgcd
2024-10-02 09:57:25
思路:
数据范围不大..
那我们就枚举M好了..
再两两判断一下有没有冲突
怎么判断呢?
exgcd!!!
p[i]*k+c[i]=p[j]*k+c[j] (mod m)
(p[j]-p[i])*k=c[i]-c[j](mod m)
(p[j]-p[i])*k+m*b=c[i]-c[j]
但是 gcd(c[i]-c[j],p[j]-p[i])不一定是1
我们就先搞出来 p[j]-p[i]和m 的gcd 记为tt
如果 c[i]-c[j]不是tt的倍数 ->无解
然后 就成了这个样子
(p[j]-p[i])*k+m*b=tt
两边同时乘一个c[i]-c[j]/tt
求k的时候 mod的数 是(m/tt)
最后再判一判
复杂度是O(n2logn*M)(虽然复杂度不对 但是能卡过去 donno why)
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,c[],p[],l[],mx;
int exgcd(int a,int b,int &x,int &y){
if(!b){x=,y=;return a;}
int tmp=exgcd(b,a%b,x,y),tt=x;
x=y;y=tt-a/b*y;return tmp;
}
bool solve(int m){
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
int k,b,t2=c[i]-c[j],tt=exgcd(((p[j]-p[i])%m+m)%m,m,k,b);
if(t2%tt)continue;
int tmp=t2/tt;
k=((k*tmp)%(m/tt)+(m/tt))%(m/tt);
if(k<=min(l[i],l[j]))return ;
}
}return ;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d%d%d",&c[i],&p[i],&l[i]),mx=max(mx,c[i]);
for(int i=mx;;i++)if(solve(i)){printf("%d\n",i);return ;}
}
最新文章
- favicon.ico 404的问题(title栏前面的图标)
- Android开发:在布局里移动ImageView控件
- SPSS数据分析—聚类分析
- angular2开发01
- 译:Google的大规模集群管理工具Borg(一)------ 用户视角的Borg特性
- Matlab数字信号处理
- kafka常用的操作命令
- malloc、calloc、realloc的区别
- 校友信息管理&;SNS互动平台之前言、目录及说明
- 指针与数组、大小端之 printf(";%x,%x,%x\n";,*(a+1),ptr1[-1],*ptr2);
- 基于visual Studio2013解决面试题之0707最小元素
- 开源:Sagit.Framework For IOS 开发框架
- epoll通俗讲解
- python 第一课 helloworld
- nginx 错误502 upstream sent too big header while reading response header from upstream
- js canvas游戏初级demo-躲避障碍物
- 使用vmimeNET解析账单邮件
- java注释讲解
- Spring Security 用户授权原理分析
- js选择排序
热门文章
- php第十八节课
- Luogu P1892 [BOI2003]团伙
- Coefficient Computation (大整数、Java解决)
- ELK6 收集不同来源的日志并做区分
- linux中的umask命令
- 【LeetCode Weekly Contest 26 Q4】Split Array with Equal Sum
- kendo Grid Unexpected number错误
- [bzoj2599][IOI2011]Race_树上点分治
- SSM(spring mvc+spring+mybatis)学习路径——2-1、spring MVC入门
- MySQL终端(Terminal)命令基本操作(转)