hdu1005 Number Sequence---找循环节
2024-09-26 04:50:48
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1005
题目大意:
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and n, you are to calculate the value of f(n).
思路:
由于模7,循环节一定在49以内,所以计算前49位,找到循环节,直接输出a[n]即可。
start为循环节开始的下标,len为循环节长度,计算a[n]时,如果 n <= start,直接输出a[n],如果大于start,输出a[start + (n - start) % len];
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
const int maxn = 1e4 + ;
typedef long long ll;
int T, n, m;
int a[maxn];
int main()
{
int x;
while(cin >> n >> m >> x && (n + m + x))
{
memset(a, , sizeof(a));
a[] = , a[] = ;
bool flag = ;
int start, len;
for(int i = ; ; i++)
{
a[i] = n * a[i - ] + m * a[i - ];
a[i] %= ;
for(int j = ; j <= i - ; j++)
{
if(a[j] == a[i - ] && a[j + ] == a[i])
{
flag = ;
start = j;
len = i - j - ;
}
if(flag)break;
}
if(flag)break;
}/*
for(int i = 1; i < start; i++)cout<<a[i]<<" ";
for(int i = start; i <= start + len; i++)cout<<a[i]<<" ";
cout<<endl;
cout<<start<<" "<<len<<endl;*/
if(x <= start)cout<<a[x]<<endl;
else cout<<a[start + (x - start) % len]<<endl;
}
return ;
}
最新文章
- linux系统的初化始配置(包括网络,主机名,关闭firewalld与selinux)
- hdu 1078 FatMouse and Cheese
- IOS应用沙盒文件操作
- openfire控制台登录不了的解决
- RECT 数据结构
- 《Secrets of the JavaScript Ninja》:JavaScript 之运行时代码
- C# list 筛选FindAll
- usaco 地震 &;&; 奶牛观光
- 利用nodeJs来安装less以及编译less文件为css文件
- Gitlab的安装及项目新建
- Ubuntu 插入鼠标自动禁用触控板
- Azure CosmosDB (13) CosmosDB数据建模
- UML和模式应用5:细化阶段(1)--第1次迭代
- (华中科大)江南雨烟 C++ STL 专栏
- cmd使用管理员权限运行,启动路径不是当前目录
- llinux 环境安装编译 nginx (源码安装包)
- cut的用法【转】
- 推荐一篇mysql优化干货
- 基于node.js+socket.io+html5实现的斗地主游戏(1)概述
- 实验1 查看CPU和内存,用机器指令和汇编指令编程