• hdu 1005


    View Code
    #include <iostream>
    #include<string>
     using namespace std;
     
     int rec[25];
     
     int main()
     {
         int a, b, n;
         rec[0] = rec[1] = rec[2] = 1;
         while( cin>>a>>b>>n&&a | b | n )
         {
             int beg, end, flag = 0;
             for( int i = 3; i <= n && !flag; ++i )
             {
                 rec[i] = ( a * rec[i-1] + b * rec[i-2] ) % 7;
                 for( int j = 2; j <= i - 1; ++j )
                 {
                     if( rec[i] == rec[j] && rec[i-1] == rec[j-1] )
                     {
                         beg = j, end = i;
                         flag = 1;
                         break;
                     }
                 }
             }
             if( flag )
             {
                cout<<rec[beg+(n-end)%(end-beg)]<<endl;
             }
             else
              cout<< rec[n]<<endl;
         }
         return 0;
     }

    一般呢,第一眼看到这个题,大家都会利用函数去做(但是我函数不是很会。)。

    通过推理可以得出:

    对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 这7个数,A,B又是固定的,所以就只有49种可能值了。由该关系式得知每一项只与前两项发生关系,所以当连续的两项在前面出现过循环节出现了,注意循环节并不一定会是开始的 1,1 。 又因为一组测试数据中f[n]只有49中可能的答案,最坏的情况是所有的情况都遇到了,那么那也会在50次运算中产生循环节。找到循环节后,就可以轻松解决了。

  • 相关阅读:
    要开学了,暂时停更
    day13 IP包头分析 | 路由器原理 1
    day12 数据链路层 | 交换机基本命令
    day11 OSI与TCP-IP 5层协议 | 物理层相关知识
    day10 扫描与爆破
    day 09 简单渗透测试
    day07 PKI
    day07 域
    day06 WEB服务器 | FTP服务器
    day05 DHCP部署与安全 | DNS部署与安全
  • 原文地址:https://www.cnblogs.com/beibeibao/p/2996424.html
Copyright © 2020-2023  润新知