C++,Migrated from Lutece 1939 能否被3整除2

/*
Migrated from Lutece 1939 能否被3整除2
Description
有数列定义为:F(0) = a, F(1) =b,F(n) = F(n-1)+F(n-2), 且0 < a < b < 20.现给出a, b, n,请问F(n)能否被3整除.

Input
有多组测试数据.输入的第一行是整数T(1<=T<=20),表示随后测试数据的组数.
每组测试数据的第一行是正整数a, b, m, a,b的含义如前所述, m表示随后有m行,每行为前面所述的n, 0 < m < 100, 0 < n < 10^9.

Output
对应每组测试数据,共输出m行,如果每行对应的F(n)能被3整除,则输出一行”Yes”,否则输出一行”No”.两组测试数据的输出间,请输出一行空行.
*/

/*
斐波那契数列对任意整数m取模后的结果是周期性的
不同的m对应不同的周期
对于m=3,周期为8
*/

// 斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
// 模3得到的数列 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
// 若斐波那契数列的初始两个数为 a, b
// (a+b)%m == (a%m + b%m)%m (mod m),这里的==指的是等式两边模m的余数相同
#include <iostream>
#include <vector>
#include <algorithm>
void solve(){
    int a,b,m;
    std::cin>>a>>b>>m;
    std::vector<int> vecN(m);
    for(auto& i : vecN)std::cin>>i;
    // curr -- a
    a%=3;b%=3;//ab : 00 11 22 01 10 12 21 02 20
    // 1 1 2 0 2 2 1 0 1 1 2 0 2 2 1 0 1 1 2 0 2 2 1 ... (mod 3)
    // 00 --> Yes
    // 01 02 --> Yes in [0,4,8,12,...]
    // 10 20 --> Yes in [1,5,9,13,...]
    // 12 21 --> Yes in [2,6,10,14,...]
    // 11 22 --> Yes in [3,7,11,15,...]
    if(a==0&&b==0){
        for(int i = 0;i<m;++i){
            std::cout<<"Yes"<<std::endl;
        }      
    }else{
        int remain = 0;
        if(a==0){
            remain = 0;
        }else if(b==0){
            remain = 1;
        }else if(a!=b){
            remain = 2;
        }else if(a==b){
            remain = 3;
        }
        for(int i = 0;i<m;++i){
            if(vecN[i]%4==remain)std::cout<<"Yes"<<std::endl;
            else std::cout<<"No"<<std::endl;
        }
    }
    std::cout<<std::endl;
}
int main(){
    int t;std::cin>>t;
    while(t--){
        solve();
    }
}


// // xf的代码
// #include <iostream>
// #include <vector>

// int main(){
//     int T;
//     std::cin >> T;
//     while(T--){
//         std::vector<int> a(8);
//         std::cin >> a[0] >> a[1];
//         int m;
//         std::cin >> m;
//         a[0] %= 3,a[1] %= 3;
//         for(int i = 2;i<10;i++){
//             a[i] = (a[i - 1] + a[i - 2])%3;
//         }
//         while(m--){
//             int n;
//             std::cin >> n;
//             if(a[n % 8] == 0){
//                 std::cout << "Yes" << std::endl;
//             }
//             else{
//                 std::cout << "No" << std::endl;
//             }
//         }
        
//             std::cout << std::endl;
//     }
// }
posted @ 2025-03-12 19:12  Kazuma_124  阅读(41)  评论(0)    收藏  举报