gcd表(欧几里得定理)

题目:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=797

gcd表

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
 
描述

大家一定对gcd很熟悉吧,现在有一个问题又来了,给你一个n*m的表,第 i 行 ,第 j 列 的值是gcd(i,j)。

然后有一个序列,你知道这个序列是否在n*m的表中的某一行出现过没。(要连续的啊)

输入
输入n,m,k(n,m如上所述,k为序列的长度,1 ≤ n, m ≤ 10^12; 1 ≤ k ≤ 10000)

接下来k个数。
输出
如果出现过输出“YES” 否则 “NO”
样例输入
100 100 5
5 2 1 2 1

100 100 7
1 2 3 4 5 6 7
样例输出
YES

NO

下面的代码超时了,AC不了,哪位大神可以帮忙解决下,感谢!!!
题目链接:

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=797

 1 #include<stdio.h>
 2 #include<string.h>
 3 int gcd(int m,int n)
 4 {
 5     if(n==0)
 6         return m;
 7     else
 8         gcd(n,m%n);
 9 }
10 int main()
11 {
12     int m,n,k,N;
13     int a[10001];
14     while(~scanf("%d%d",&m,&n))
15     {
16         scanf("%d",&N);
17         int count = 1;
18         int mark = 0;
19         memset(a,0,sizeof(a));
20         for(int i=0;i<N;i++)
21         {    
22             scanf("%d",&a[i]);
23         }
24         for(int i=1;i<=m;i++)
25         {
26             for(int j=1;j<=n;j++)
27             {
28                 if(gcd(i,j) == a[count] &&count <N)
29                 {
30                     count++;    
31                 }
32                 else
33                 {
34                     count = 0;
35                 }
36                 if(count == N)
37                 {                
38                     mark = 1;
39                     break;
40                 }
41             }
42         }
43         printf("%s\n",mark?"YES":"NO");
44         mark = 0;
45     }
46     return 0;
47 }

 

posted @ 2018-06-21 11:10  无心小男  阅读(778)  评论(0编辑  收藏  举报