Number Sequence(http://acm.hdu.edu.cn/showproblem.php?pid=1005)

本文介绍了一个关于数列计算的问题,通过寻找数列的周期来高效计算特定项的值。利用模运算解决大规模数值计算问题,并提供了一段C语言代码实现。

Number Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 129001    Accepted Submission(s): 31388


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.
 

Sample Input
1 1 3 1 2 10 0 0 0
 

Sample Output
2 5
#include<stdio.h>
#include<string.h>
#define max 100000
int main()
{
    int a,b,n,i,j,x[max];
    while(scanf("%d%d%d",&a,&b,&n)&&(a||b||n))
    {
        x[1]=1;
        x[2]=1;
        for(i=3;i<=1001;++i)//找周期
        {
            x[i]=((a*x[i-1]+b*x[i-2])%7);
            if(x[i]==1&&x[i-1]==1)//周期的条件
            break;
        }
        int t=i-2;//确定周期
        int c=n%t;//判断
        if(c==0)
        printf("%d\n",x[t]);
        else
        printf("%d\n",x[c]);
    }
    return 0;
} 

<think>我们正在处理一个关于Activiti 6.0的BPMN XML文件验证错误。错误信息是: `org.activiti.bpmn.exceptions.XMLException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'boundaryEvent'.` 这个错误通常是由于XML结构不符合BPMN 2.0规范导致的。具体来说,在定义`boundaryEvent`元素时,可能出现了以下问: 1. 边界事件(boundaryEvent)放置的位置不正确,或者其父元素不是可以附加边界事件的元素(如UserTask, SubProcess等)。 2. XML中元素的顺序不符合BPMN规范的要求。 3. 缺少必要的命名空间声明。 根据BPMN 2.0规范,边界事件必须作为可附加边界活动的子元素(如UserTask、SubProcess等),并且边界事件必须紧跟在父元素的扩展元素(extensionElements)之后,但在任何子元素(如incoming/outgoing)之前。 ### 解决方案步骤 #### 1. 检查边界事件的位置 在BPMN XML中,边界事件必须直接嵌套在它要附加的节点内,并且必须是该节点的第一个子元素(在`extensionElements`之后,但在其他子元素如`incoming`、`outgoing`之前)。 **错误示例**: ```xml <userTask id="userTask1" name="User Task"> <incoming>flow1</incoming> <outgoing>flow2</outgoing> <!-- 错误:boundaryEvent应该放在incoming/outgoing之前 --> <boundaryEvent id="boundaryTimer" attachedToRef="userTask1"> <timerEventDefinition> <timeDuration>PT5M</timeDuration> </timerEventDefinition> </boundaryEvent> </userTask> ``` **正确示例**: ```xml <userTask id="userTask1" name="User Task"> <!-- 正确:boundaryEvent作为userTask的第一个子元素(在extensionElements之后,如果有的话) --> <boundaryEvent id="boundaryTimer" attachedToRef="userTask1"> <timerEventDefinition> <timeDuration>PT5M</timeDuration> </timerEventDefinition> </boundaryEvent> <incoming>flow1</incoming> <outgoing>flow2</outgoing> </userTask> ``` #### 2. 确保XML元素顺序符合BPMN规范 BPMN规范要求元素必须按照特定的顺序出现。在流程(process)或子流程(subProcess)中,子元素的顺序如下: 1. 扩展元素(extensionElements) 2. 属性(如`name`等,但通常作为属性出现) 3. 任何事件(如边界事件、中间事件等) 4. 数据对象(dataObject) 5. 流程元素(如userTask, sequenceFlow等) 在任务(如userTask)内部,子元素的顺序是: 1. `extensionElements`(可选) 2. 事件(如`boundaryEvent`) 3. `incoming` 4. `outgoing` #### 3. 检查命名空间声明 确保在根元素`definitions`中声明了必要的命名空间。Activiti 6.0通常需要以下命名空间: ```xml <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" targetNamespace="http://activiti.org/bpmn"> ``` #### 4. 完整示例 以下是一个包含正确边界事件位置的BPMN XML片段: ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.activiti.org/test"> <process id="myProcess" name="My Process"> <startEvent id="start" name="Start"/> <sequenceFlow id="flow1" sourceRef="start" targetRef="userTask1"/> <userTask id="userTask1" name="User Task"> <!-- 边界事件必须放在userTask内部,并且是第一个子元素(在extensionElements之后) --> <boundaryEvent id="boundaryTimer" attachedToRef="userTask1"> <timerEventDefinition> <timeDuration>PT5M</timeDuration> </timerEventDefinition> <outgoing>flowToEnd</outgoing> </boundaryEvent> <incoming>flow1</incoming> <outgoing>flow2</outgoing> </userTask> <sequenceFlow id="flow2" sourceRef="userTask1" targetRef="end"/> <endEvent id="end" name="End"/> <!-- 边界事件流出的路径 --> <sequenceFlow id="flowToEnd" sourceRef="boundaryTimer" targetRef="end"/> </process> </definitions> ``` #### 5. 使用验证工具 在部署之前,可以使用XML验证工具(如Eclipse的XML验证)检查BPMN文件是否符合BPMN 2.0 XSD。Activiti自带的BPMN XSD文件可以在其jar包中找到(`org/activiti/impl/bpmn/parser/BPMN20.xsd`),或者从官方网站获取。 ### 常见错误排查 1. **ID重复**:确保所有元素的`id`属性唯一。 2. **attachedToRef引用错误**:`boundaryEvent`的`attachedToRef`属性必须指向同一个父元素内的任务或子流程的id。 3. **缺少必要的元素**:例如,边界事件必须有一个事件定义(如`signalEventDefinition`, `timerEventDefinition`等)。 ### 相关问 §§相关问§§ 1. 如何解决Activiti中出现的`cvc-id.1: There is no ID/IDREF binding for IDREF 'xxx'`错误? 2. Activiti 6.0中边界事件和中间事件有什么区别? 3. 如何在Activiti中正确使用定时器边界事件? 4. 如何验证BPMN 2.0 XML文件的正确性? [^1]: 错误信息参考自Activiti官方文档关于XML解析的说明 [^2]: ID引用错误通常由XML中ID重复或未定义引起</think>### 解决 Activiti 6.0 XMLException: cvc-complex-type.2.4.a 错误 在 Activiti 6.0 中使用边界事件时出现 `cvc-complex-type.2.4.a` 错误,通常是由于 **BPMN 文件结构不符合 XML 模式定义 (XSD)** 导致的。以下是完整解决方案: --- #### 一、错误原因分析 1. **XML 结构顺序错误** BPMN 2.0 规范严格要求元素声明顺序,常见错误示例: ```xml <process id="myProcess"> <!-- 错误:boundaryEvent 必须在父元素内部声明 --> <boundaryEvent id="errorBoundary" attachedToRef="task1">...</boundaryEvent> <userTask id="task1" name="Task"> <!-- 正确位置应在此处 --> </userTask> </process> ``` 2. **命名空间缺失** 缺少必要的命名空间声明,特别是 `xmlns:activiti`。 3. **元素位置违规** `boundaryEvent` 必须直接嵌套在**被附加的节点内部**,且必须是该节点的第一个子元素。 --- #### 二、解决方案(修复 BPMN XML) ##### 正确结构示例 ```xml <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://activiti.org/bpmn"> <process id="jumpProcess"> <!-- 1. 被附加的节点(如 UserTask) --> <userTask id="task1" name="审批节点"> <!-- 2. boundaryEvent 必须是第一个子元素 --> <boundaryEvent id="signalBoundary" attachedToRef="task1"> <signalEventDefinition signalRef="JUMP_SIGNAL" /> </boundaryEvent> <!-- 3. 其他子元素(顺序敏感!) --> <extensionElements>...</extensionElements> <incoming>flowIn</incoming> <outgoing>flowOut</outgoing> </userTask> <!-- 4. 目标节点 --> <userTask id="targetTask" name="目标节点"/> <!-- 5. 连接边界事件到目标节点 --> <sequenceFlow sourceRef="signalBoundary" targetRef="targetTask" /> </process> </definitions> ``` ##### 关键修复点 1. **元素顺序强制要求** 在父节点(如 `userTask`)内部的正确顺序: ```markdown 1. boundaryEvent 2. extensionElements(可选) 3. incoming 4. outgoing ``` 2. **命名空间声明** 必须包含: ```xml xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" ``` 3. **attachedToRef 验证** 确保 `attachedToRef` 指向 **同一父节点内的有效节点ID**: ```xml <!-- 正确 --> <boundaryEvent attachedToRef="task1"> <!-- task1 在同一个 userTask 内 --> <!-- 错误 --> <boundaryEvent attachedToRef="externalTask"> <!-- 外部节点 --> ``` --- #### 三、验证工具 1. **在线 XSD 验证** 使用 [BPMN 2.0 官方验证器](https://www.bpmn.io/validator/) 检查文件 2. **Activiti 内置验证** 在流程部署前进行校验: ```java ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repoService = engine.getRepositoryService(); // 开启严格模式验证 repoService.createDeployment() .addClasspathResource("process.bpmn20.xml") .disableSchemaValidation() // 先关闭验证定位错误 .deploy(); ``` --- #### 四、错误排查步骤 1. **检查 XML 结构** 使用 IDE(如 IntelliJ)的 XML 格式化功能,验证元素缩进和嵌套关系。 2. **查看完整错误日志** 定位具体出错的行号: ``` cvc-complex-type.2.4.a: Invalid content was found starting with element 'boundaryEvent' Line 15, Column 5: <boundaryEvent id="errorBoundary"...> ``` 3. **简化测试** 逐步移除边界事件相关代码,验证基础流程能否部署。 --- #### 五、完整正确示例 ```xml <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://activiti.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd"> <process id="errorFixProcess"> <startEvent id="start"/> <sequenceFlow sourceRef="start" targetRef="task1"/> <!-- 被附加的节点 --> <userTask id="task1" name="Main Task"> <!-- 边界事件必须是第一个子元素 --> <boundaryEvent id="timeoutBoundary" attachedToRef="task1"> <timerEventDefinition> <timeDuration>PT30M</timeDuration> </timerEventDefinition> <outgoing>flowToTarget</outgoing> </boundaryEvent> <incoming>startToTask</incoming> <outgoing>taskToEnd</outgoing> </userTask> <!-- 目标节点 --> <userTask id="targetTask" name="Timeout Handler"/> <!-- 序列流连接 --> <sequenceFlow id="flowToTarget" sourceRef="timeoutBoundary" targetRef="targetTask"/> <endEvent id="end"/> <sequenceFlow sourceRef="targetTask" targetRef="end"/> </process> </definitions> ``` > **最佳实践**:使用 [Activiti Modeler](https://www.activiti.org/userguide/#_activiti_modeler) 设计流程可自动避免结构错误[^1]。 --- ### 相关问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值