博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1573:X问题(解一元线性同余方程组)
阅读量:6424 次
发布时间:2019-06-23

本文共 1719 字,大约阅读时间需要 5 分钟。

题目:

题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语。

这题就是求解一元线性同余方程组的解满组小于正整数n的数目。最小正整数的解为X=(X*(c/d)%t+t)%t;

  X=a1*X+r1;其中X为扩展欧几里得解出来的特解,这m个方程组的循环区间为lcm(a1,a2,a3...am),
所以答案为(n-X)/lcm+1;

#include 
#include
#include
#include
#include
using namespace std;__int64 a,b,c,d;__int64 X,Y;__int64 gcd(__int64 A,__int64 B){ return B==0?A:gcd(B,A%B);}void extend(__int64 A,__int64 B,__int64 &d,__int64 &x1,__int64 &y1){ if(B==0) { x1=1; y1=0; d=A; return ; } extend(B,A%B,d,x1,y1); __int64 temp=x1; x1=y1; y1=temp-(A/B)*y1; return ;}int main(){ __int64 S[120],E[120]; __int64 a1,r1,a2,r2,Lcm; __int64 T; int n,m; scanf("%I64d",&T); while(T--) { scanf("%d%d",&n,&m); Lcm=1; for(int i=1; i<=m; i++) { scanf("%I64d",&S[i]); Lcm=Lcm/gcd(Lcm,S[i])*S[i];//在一定程度上可以防止爆类型(Lcm*S[i]/gcd()) } for(int i=1; i<=m; i++) { scanf("%I64d",&E[i]); } bool ifhave=true; a1=S[1],r1=E[1]; for(__int64 i=2; i<=m; i++) { a2=S[i],r2=E[i]; a=a1; b=a2; c=r2-r1; extend(a,b,d,X,Y); if(c%d) { ifhave=false; break; } __int64 t=b/d; X=(X*(c/d)%t+t)%t; X=a1*X+r1; a1=a1*(a2/d); r1=X; } __int64 ans=0; if(!ifhave) { printf("0\n"); continue; } if(r1<=n) ans=1+(n-r1)/Lcm; if(r1==0&&ans) ans--; printf("%I64d\n",ans); } return 0;}

 

转载地址:http://ysrra.baihongyu.com/

你可能感兴趣的文章
16.Python网络爬虫之Scrapy框架(CrawlSpider)
查看>>
stm 常用头文件
查看>>
mac 删除文件夹里所有的.svn文件
查看>>
程序制作 代写程序 软件定制 代写Assignment 网络IT支持服务
查看>>
mysql 案例~select引起的性能问题
查看>>
直接读取图层
查看>>
springsecurity 源码解读 之 RememberMeAuthenticationFilter
查看>>
HTML5标准学习 - 编码
查看>>
JS 时间戳转星期几 AND js时间戳判断时间几天前
查看>>
UVa11426 最大公约数之和(正版)
查看>>
mime
查看>>
SQL练习之求解填字游戏
查看>>
DOM
查看>>
关于网上商城开发的随笔记录1
查看>>
UIApplication
查看>>
12:Web及MySQL服务异常监测案例
查看>>
hdu 3955 March
查看>>
数据库性能优化之冗余字段的作用
查看>>
C语言程序设计第五次作业
查看>>
Go语言的接口
查看>>