同余定理:poj2769 Reduced ID Numbers(标记数组)+hdu1021 Fibonacci Again(应用于递推公式)

Reduced ID Numbers

Description

T. Chur teaches various groups of students at university U. Every U-student has a unique Student Identification Number (SIN). A SIN s is an integer in the range 0 ≤ s ≤ MaxSIN with MaxSIN = 10 6-1. T. Chur finds this range of SINs too large for identification within her groups. For each group, she wants to find the smallest positive integer m, such that within the group all SINs reduced modulo m are unique.

Input

On the first line of the input is a single positive integer N, telling the number of test cases (groups) to follow. Each case starts with one line containing the integer G (1 ≤ G ≤ 300): the number of students in the group. The following G lines each contain one SIN. The SINs within a group are distinct, though not necessarily sorted.

Output

For each test case, output one line containing the smallest modulus m, such that all SINs reduced modulo m are distinct.

Sample Input

2
1
124866
3
124866
111111
987651

Sample Output

1
8

解题思路:标记数组

   没什么好的办法,从1开始枚举,开一个标记数组bool p[i]表示存不存在余数是i的ID Numbers,出现的话跳出循环,否则继续标记,直到最先找到i使得任意一个ID number对i均不同余为止,此时i最小,即为我们所要的最小的满足每组各个同学编号均不同余。

   注意:不要对每一个i都进行memset(p,false,sizeof(p)),数组p[maxn]很大会超时,只需将可能出现的p[1-i]初始化为false即可。

参考代码+部分解释:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
#include 
       
       
         #include 
        
          #include 
         
           using namespace std; const int maxn=1000000+10; int a[350]; bool p[maxn]; //开一个标记数组 int main() { // freopen("input.txt","r",stdin); int T;cin>>T; while(T--){ int n;cin>>n; for(int i=0;i 
          
            >a[i]; int i=1; while(1){ bool ok=true; // memset(p,false,sizeof(p)); //标记数组初始化 for(int j=0;j 
            
           
          
         
       
     
     
    
    
   
   

                                                        Fibonacci Again


Problem Description
There are another kind of Fibonacci numbers: F(0) = 7, F(1) = 11, F(n) = F(n-1) + F(n-2) (n>=2).
 

Input
Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000).
 

Output
Print the word "yes" if 3 divide evenly into F(n).

Print the word "no" if not.
 

Sample Input
   
   
0 1 2 3 4 5
 

Sample Output
   
   
no no yes no no no


解题思路:同余定理的应用。

参考代码:

#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
#include 
        
        
          #include 
         
           #include 
          
            using namespace std; const int maxn=1000000+10; int F[maxn]; int main() { // freopen("input.txt","r",stdin); F[0]=7;F[1]=11; for(int i=2;i 
           
             >n){ if(F[n]==0) cout<<"yes"< 
             
            
           
          
        
      
      
     
     
    
    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值