zoukankan      html  css  js  c++  java
  • hdu-5768 Lucky7(容斥定理+中国剩余定理)

    题目链接:

    Lucky7

    Time Limit: 2000/1000 MS (Java/Others)  

      Memory Limit: 65536/65536 K (Java/Others)



    Problem Description
     
    When ?? was born, seven crows flew in and stopped beside him. In its childhood, ?? had been unfortunately fall into the sea. While it was dying, seven dolphins arched its body and sent it back to the shore. It is said that ?? used to surrounded by 7 candles when he faced a extremely difficult problem, and always solve it in seven minutes. 
    ?? once wrote an autobiography, which mentioned something about himself. In his book, it said seven is his favorite number and he thinks that a number can be divisible by seven can bring him good luck. On the other hand, ?? abhors some other prime numbers and thinks a number x divided by pi which is one of these prime numbers with a given remainder ai will bring him bad luck. In this case, many of his lucky numbers are sullied because they can be divisible by 7 and also has a remainder of ai when it is divided by the prime number pi.
    Now give you a pair of x and y, and N pairs of ai and pi, please find out how many numbers between x and y can bring ?? good luck.
     
    Input
     
    On the first line there is an integer T(T≤20) representing the number of test cases.
    Each test case starts with three integers three intergers n, x, y(0<=n<=15,0<x<y<1018) on a line where n is the number of pirmes. 
    Following on n lines each contains two integers pi, ai where pi is the pirme and ?? abhors the numbers have a remainder of ai when they are divided by pi. 
    It is guranteed that all the pi are distinct and pi!=7. 
    It is also guaranteed that p1*p2*…*pn<=1018 and 0<ai<pi<=105for every i∈(1…n).
     
    Output
     
    For each test case, first output "Case #x: ",x=1,2,3...., then output the correct answer on a line.
     
    Sample Input
     
    2
    2 1 100
    3 2
    5 3
    0 1 100
     
    Sample Output
     
    Case #1: 7
    Case #2: 14

     题意:

    问[l,r]中有多少个数%7==0且%pi!=ai;

    思路:

    范围太大,用容斥原理求出%7==0&&%pi==ai,的这些再加加减减;

    CRT用的白书的板子;还不太会,明天来好好学学;代码参考了http://blog.csdn.net/danliwoo/article/details/52058069

    AC代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <bits/stdc++.h>
    #include <stack>
    
    using namespace std;
    
    #define For(i,j,n) for(int i=j;i<=n;i++)
    #define mst(ss,b) memset(ss,b,sizeof(ss));
    
    typedef  long long LL;
    
    template<class T> void read(T&num) {
        char CH; bool F=false;
        for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
        for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
        F && (num=-num);
    }
    int stk[70], tp;
    template<class T> inline void print(T p) {
        if(!p) { puts("0"); return; }
        while(p) stk[++ tp] = p%10, p/=10;
        while(tp) putchar(stk[tp--] + '0');
        putchar('
    ');
    }
    
    const LL mod=20071027;
    const double PI=acos(-1.0);
    const int inf=1e9;
    const int N=(1<<8)+100;
    const int maxn=(1<<8);
    const double eps=1e-8;
    
    
    int n,flag[20];
    LL L,R,m[20],a[20];
    LL cal(LL x,LL y,LL mod)
    {
        LL s=0,base=x;
        while(y)
        {
            if(y&1)s=(s+base)%mod;
            base=(base+base)%mod;
            y>>=1;
        }
        return s;
    }
    LL gao(LL x, LL r, LL p){
        return (x-r)/p;
    }
    
    void exgcd(LL fa,LL fb,LL &d,LL &x,LL &y)
    {
        if(fb==0){d=fa;x=1;y=0;}
        else
        {
            exgcd(fb,fa%fb,d,y,x);
            y-=x*(fa/fb);
        } 
    }
    inline LL CRT()
    {
        LL M=1,d,y,x=0;
        For(i,0,n)if(flag[i])M=M*m[i];    
        For(i,0,n)
        {
            if(!flag[i])continue;
            LL w=M/m[i];
            exgcd(m[i],w,d,d,y);
            y=(y%M+M)%M;
            x=(x+cal(cal(y,w,M),a[i],M))%M;
        }  
         x=(x+M)%M;
        LL ans=gao(R+M,x,M)-gao(M+L-1,x,M);
        return ans;
    }
    
    int main()
    {       
            int t,Case=0;
            read(t);
            while(t--)
            {
                read(n);read(L);read(R);
                For(i,0,n-1)
                {
                    read(m[i]);read(a[i]);
                }
                m[n]=7;a[n]=0;flag[n]=1;
                int sum=(1<<n);
                LL ans=0;
                For(i,0,sum-1)
                {
                    int num=0;
                    for(int j=0;j<n;j++)
                    {
                        if(i&(1<<j))flag[j]=1;
                        else flag[j]=0;
                        num+=flag[j];
                    }
                    if(num&1)num=-1;
                    else num=1;
                    ans=ans+num*CRT();
                }
                printf("Case #%d: %lld
    ",++Case,ans);
            }
            
            return 0;
    }
    

      

  • 相关阅读:
    逻辑智力题【更新中】
    每天进步一点点_抽奖程序
    GDC2016【For Honor-荣耀战魂】的次世代动画技术
    GDC2016【彩虹六号:围攻 】使丰富的“突破”成为可能的破坏系统
    GDC2016 【巫师3 狂猎】的游戏事件工作流
    GDC 2016 神秘海域4中使用Substance制作Texture
    GDC2016【全境封锁(Tom Clancy's The Division)】对为何对应Eye Tracked System,以及各种优点的演讲报告
    【FFXV】中物理模拟的结构以及游戏业界的乐趣
    龙珠 超宇宙 [Dragon Ball Xenoverse]
    如龙0
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/5716800.html
Copyright © 2011-2022 走看看