ACM数学题目1 Multiple of Seven

声明:

题目来源:HOJ 13375(Origin: HNU Contest)

本题为本人与同学讨论做出,仅给出本人的解法。

 

Multiple of 7

Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB
Total submit users: 127, Accepted users: 62
Problem 13775 :

No special judgement

Problem description

Give you an integer such as abab..... with length n. where a,b are digit.1< = a < = 9, 0< = b < = 9. Your task is to answer whether the given integer is multiple of 7.

For example, 3535 ,343,141414 are multiples of 7,and 121,11,2,232 are not.
 

Input

There are multiple test cases, the first line contain an integer T, the number of test cases. 1 < = T < = 1000.

Each test case contains 3 integers in one line: a,b,n.

1< = a < = 9, 0< = b < = 9, 1< = n < = 10^9.


 

Output

For each test case, output “Yes” if the integer is multiple of 7 , otherwise output “No”.
 

Sample Input

3
1 2 3
3 5 4
3 4 3

Sample Output

No
Yes
Yes

Judge Tips

The first case 121 is not multiple of 7,the 2nd and 3rd ,3535 and 343 are multiples of 7.


 

Problem Source

HNU Contest 

数据范围:1<=a<=9,0<=b<=9,1<=n<=1e9

题解思路:本题的关键在于熟练运用同余的性质,观察数据范围,最大可接受的时间复杂度为O(logn),但无法实现,再加上数字循环的性质,不能构造数组遍历,给出两种解法:

此方法:时间复杂度为O(n%6),也可以认为是O(1)

对于输入的数,可以按如下规则分解:

ACM数学题目1 Multiple of Seven_第1张图片

ACM数学题目1 Multiple of Seven_第2张图片

于是,我们求解的问题就可以转化为对如下问题:

我们根据引理1:

 

ACM数学题目1 Multiple of Seven_第3张图片

我们也可以画图验证引理1:f(k)是离散的周期函数。

ACM数学题目1 Multiple of Seven_第4张图片

根据引理1,可以得到

ACM数学题目1 Multiple of Seven_第5张图片

我们发现:

ACM数学题目1 Multiple of Seven_第6张图片

也就是说,对于一个长度为n的这样的整数,对7取模,低位的数可以每6位一起消掉,只用考虑余下的高位即可。

例如:

35353535mod7=35mod7

4444444444mod7=4444mod7

接下来实现方法就有很多了。故时间复杂度根据实现,可以为O(n%6)或O(1)。

注意实现时a和b谁和奇数位相乘,谁和偶数位相乘。

题解:

#include

const int div[6]={1,3,2,6,4,5};
int t,a,b,n,ans;

int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&a,&b,&n);
		n=n%6;
		switch(n){
			case 0:ans=0;break;
			case 1:ans=a*div[0];break;
			case 2:ans=b*div[0]+a*div[1];break;
			case 3:ans=a*(div[0]+div[2])+b*div[1];break;
			case 4:ans=b*(div[0]+div[2])+a*(div[1]+div[3]);break;
			case 5:ans=a*(div[0]+div[2]+div[4])+b*(div[1]+div[3]);break;
		}
		printf(ans%7==0?"Yes\n":"No\n");
	}
}

 

 

你可能感兴趣的:(ACM数学题目,算法,acm竞赛,数学)