hdoj-1005-C

本文介绍了一种解决大规模数值序列问题的方法,该序列定义为f(1)=1,f(2)=1,f(n)=(A*f(n-1)+B*f(n-2))%7。通过观察发现,序列的取模结果具有周期性,利用这一特性可以高效计算任意项f(n)的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

A number sequence is defined as follows:
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).

Input

The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.

Output

For each test case, print the value of f(n) on a single line.

刚开始看以为是递归调用,提交了一个错误代码,然后才看见N的取值范围很大,取模运算结果有规律可循。
不难发现,f(n)的值域为[0,6],因为f(n) = (A * f(n - 1) + B * f(n - 2)) %7,又因为起点值为1,所以48个N的取值为一组。有了这个思路了以后就可以写出下面的代码了:

#include<stdio.h>
#include<stdlib.h>
int fun(int a,int b,int n);
int main()
{
    int a;
    int b;
    int n;
    while(scanf("%d%d%d",&a,&b,&n)==3 && a||b||n){
        printf("%d\n",fun(a,b,n%48));
    }
}

int fun(int a,int b,int n)
{
   return(n==1 || n==2)?1:(a*fun(a,b,n-1)+b*fun(a,b,n-2))%7;
}
### HDOJ 2065 C语言解题思路及代码实现 #### 题目描述 HDOJ 2065 是一道关于字符串处理的经典题目。给定一段英文文本,要求将其中的单词顺序反转并保持标点符号位置不变。 #### 解题思路 为了高效解决这个问题,可以采用双端队列(deque)来辅助处理。具体来说: - 使用两个指针分别指向当前读取的位置和待输出的位置。 - 当遇到字母时将其压入栈中暂存。 - 若碰到非字母字符,则直接输出该字符,并依次弹出栈内的所有字母直至为空[^1]。 这种方法不仅逻辑清晰简单易于理解,同时也保证了较高的执行效率。 #### 代码实现 以下是基于上述思路编写的C语言版本解决方案: ```c #include <stdio.h> #include <ctype.h> #define MAX_LEN 1000 // 定义最大长度常量 int main() { char str[MAX_LEN], stack[MAX_LEN]; int top = -1; fgets(str, sizeof(str), stdin); for(int i = 0; str[i]; ++i){ if(isalpha(str[i])){ stack[++top] = str[i]; // 字母入栈 }else{ while(top != -1){ // 输出栈内所有字母 putchar(stack[top--]); } putchar(str[i]); // 输出非字母字符 } } while(top != -1){ // 处理最后一串连续字母 putchar(stack[top--]); } return 0; } ``` 此段代码通过`fgets()`函数获取输入字符串,并利用标准库中的`isalpha()`函数判断字符是否为英文字母。对于每一个非空白字符,如果是字母则加入到临时保存区域(即stack数组),如果不是字母而是其他符号,则先打印之前累积的所有字母再打印这个特殊符号。最后还需额外检查一次堆栈里是否有剩余未被处理过的字母序列[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值