同余定理 专题

更新中

题目集

poj 2769 Reduced ID Numbers http://poj.org/problem?id=2769 这题算是最基本的同余定理的题目吧,以为时间限定比较宽,所以暴力是行的通的。但是也有坑点:不能定义一个1e6大小的bool 型标记数组还用memset清零,这样时间复杂度就达到1e9的级别了。所以清零技巧成了这个题的重中之重

/**************************************************************
    Problem:poj 2769
    User: youmi
    Language: C++
    Result: Accepted
    Time:1344MS
    Memory:1100K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d
",a)
#define ptlld(a) printf("%I64d
",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;

int n;

const int maxn=(int)1e5;//为什么1e5就够了还没搞明白,求大神指点啊,直觉应该开到1e6。。。。。
int flag[maxn];
int a[400];
int main()
{
    //freopen("in.txt","r",stdin);
    int T_T;
    scanf("%d",&T_T);
    for(int kase=1;kase<=T_T;kase++)
    {
        sc(n);
        rep1(i,n)
            sc(a[i]);
        int ans=0,bk;
        while(++ans)
        {
            rep0(i,ans)
             flag[i]=0;//804K    360MS
            //zeros(flag);//1100K    1344MS  时间复杂度差距实在大的吓人,memset慎用啊
            bk=0;
            rep1(j,n)
            {
                if(flag[a[j]%ans])
                {
                    bk=1;
                    break;
                }
                flag[a[j]%ans]=1;
            }
            if(bk==0)
                break;
        }
        pt(ans);
    }
    return 0;
}

hdu 2035 人见人爱A^B http://acm.hdu.edu.cn/showproblem.php?pid=2035 这个题是个快速幂的题,当然利用的性质是ab==(a%m)(b%m)(mod m)

/**************************************************************
    Problem:hdu 2035
    User: youmi
    Language: C++
    Result: Accepted
    Time:0MS
    Memory:1728K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <ctime>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d
",a)
#define ptlld(a) printf("%I64d
",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;
int n,m;
ll mod_mul(ll a,ll b,ll mod)
{
    ll res=0;
    a%=mod;
    while(b)
    {
        if(b&1)
            res=(res+a)%mod;
        b>>=1;
        a<<=1;
    }
    return res;
}
ll mod_exp(ll a,ll b,ll mod)
{
    ll res=1;
    a%=mod;
    while(b)
    {
        if(b&1)
            res=mod_mul(res,a,mod);
        b>>=1;
        a=mod_mul(a,a,mod);
    }
    return res;
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~sc2(n,m)&&n+m)
    {
        ptlld(mod_exp(n,m,1000));
    }
    return 0;
}

hdu 1021 Fibonacci Again http://acm.hdu.edu.cn/showproblem.php?pid=1021 这个题其实可以用性质:

c=a+b,(c mod m)==((a%m)+(b%m))mod m ;

但是呢,因为fibonacci数列非常出名,所以性质也有那么一堆:其中一条便是:fn能被3整除,当且仅当n可以被4整除

于是我们可以观察规律:

n    7的系数  11的系数

0  1    0

1  0    1

2  1    1

3  1    2

4  2    3

5  3    5

6  5    8

7  8    13

8  13    21

9  21    34

10  34    55

.......................

可以发现(7+11)%3==0,所以只要两者的系数差3,那么新的fn%3==0。利用fibonacci数列性质(11的系数分布即为fibonacci数列分布),可得

(n-2)%4==0时,fn%3==0

/**************************************************************
    Problem:hdu 1021
    User: youmi
    Language: C++
    Result: Accepted
    Time:0MS
    Memory:1728K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <sstream>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define Max(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define pt(a) printf("%d
",a)
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;
int n;


int main()
{
    //freopen("in.txt","r",stdin);
    while(~sc(n))
    {
        if(n%4==2)
            printf("yes
");
        else
            printf("no
");
    }
    return 0;
}
不为失败找借口,只为成功找方法
原文地址:https://www.cnblogs.com/youmi/p/4797504.html