hdu 1573: X问题(线性同余方程组求正整数解的个数)

这篇博客主要介绍了如何解决X问题,即线性同余方程组寻找正整数解的数量。解题关键在于理解求解过程和解的含义,并通过参考poj 2891题解来掌握计数方法,特别注意需要考虑x=0的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                X问题

Problem Description
求在小于等于N的正整数中有多少个X满足:X mod a[0] = b[0], X mod a[1] = b[1], X mod a[2] = b[2], …, X mod a[i] = b[i], … (0 < a[i] <= 10)。
 

Input
输入数据的第一行为一个正整数T,表示有T组测试数据。每组测试数据的第一行为两个正整数N,M (0 < N <= 1000,000,000 , 0 < M <= 10),表示X小于等于N,数组a和b中各有M个元素。接下来两行,每行各有M个正整数,分别为a和b中的元素。
 

Output
对应每一组输入,在独立一行中输出一个正整数,表示满足条件的X的个数。
 

Sample Input
  
3 10 3 1 2 3 0 1 2 100 7 3 4 5 6 7 8 9 1 2 3 4 5 6 7 10000 10 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9
 

Sample Output
  
1 0 3

解题思路:线性同余方程求正整数解的个数

首先要熟练求解过程,每次两两求解保存下来的值代表什么意思;

参考题解:poj 2891 Strange Way To Express Integers(线性同余方程组)  点击打开链接 

最重要的是,解的个数怎样计数,而且要特判x=0(只要正整数的解)

参考代码:

#include 
  
   
#include 
   
    
#include 
    
     
#include 
     
#include 
      
       
#include 
       
         #include
        
          using namespace std; typedef __int64 ll; const int maxn=1000000+10; ll a[15],b[15],A,B,M,x,y,d; ll extended_gcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得算法,计算ax+by=gcd(a,b)的线性系数x,y,并返回gcd(a,b) { if(b==0) {x=1;y=0;return a;} ll d=extended_gcd(b,a%b,y,x); y-=a/b*x; return d; } ll solve() { int n,m;cin>>n>>m; for(int i=1;i<=m;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>b[i]; for(int i=2;i<=m;i++){ A=a[1];B=a[i];M=b[i]-b[1]; d=extended_gcd(A,B,x,y); if(M%d) return 0; x=((x*M/d)%(B/d)+(B/d))%(B/d); b[1]=x*a[1]+b[1]; a[1]=(a[1]*a[i])/d; } ll ans=0; for(ll i=b[1];i<=n;i+=a[1]) ans++; if(ans&&b[1]==0) ans--; return ans; } int main() { // freopen("input.txt","r",stdin); int T;cin>>T; while(T--){ cout<
         
          <
          
         
        
       
      
    
   
  






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值