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;
}

 

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