您的位置:首页 > 其它

同余定理 专题

2015-09-10 12:45 253 查看
更新中

题目集

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\n",a)
#define ptlld(a) printf("%I64d\n",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\n",a)
#define ptlld(a) printf("%I64d\n",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\n",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\n");
else
printf("no\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: