hud 5690 All X (快速幂 or 循环节)

https://vjudge.net/problem/387912/origin

F(x,m)F(x,m) 代表一个全是由数字xx组成的mm位数字。请计算,以下式子是否成立: 

F(x,m) mod k ≡ cF(x,m) mod k ≡ c

Input

第一行一个整数TT,表示TT组数据。 
每组测试数据占一行,包含四个数字x,m,k,cx,m,k,c 

1≤x≤91≤x≤9 

1≤m≤10101≤m≤1010 

0≤c<k≤10,0000≤c<k≤10,000 

Output

对于每组数据,输出两行: 
第一行输出:"Case #i:"。ii代表第ii组测试数据。 
第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。 

Sample Input

3
1 3 5 2
1 3 5 1
3 5 99 69

Sample Output

Case #1:
No
Case #2:
Yes
Case #3:
Yes

学到了学到了

a % b == c 这三个数同时乘以一个正整数,式子依然成立

还有

m个x  == x * m个1 = x * ( 1 + 10 + 100 + 10^m ) 等比数列求和

#include<bits/stdc++.h>
using namespace std;
using lon = long long;

lon quick(lon a,lon b,lon c)//快速幂取模
{
	lon ans=1;
	a%=c;
	while(b)
	{
		if(b&1) 
			ans = ans * a %c;
			
		a = a * a % c;
		b >>= 1;
	}
	return ans%c;
}

lon slove(lon x, lon m, lon k)
{
//	cout << (quick(10, m, k) - 1)  << endl;
	return ((quick(10, m, k*9) - 1) * x) % (k * 9);
}

int main()
{
	int T;
	cin >> T;
	for(int tt = 1; tt <= T; tt++)
	{
		lon x, m, k, c;
		cin >> x >> m >> k >> c;
		printf("Case #%d:\n", tt);
		//cout << slove(x, m, k) << endl;
		cout << ((slove(x, m, k) == c * 9) ? "Yes" : "No") << endl;
	}
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章