hdu 5690 바 이 두 의 별 All X (행렬 쾌속 멱)

1972 단어 HDU
Problem Description
F(x,m)  하 나 를 대표 하 는 것 은 모두 숫자 이다.
x 구성의
m 자리 숫자.다음 식 이 성립 되 었 는 지 계산 하 십시오.
F(x,m) mod k ≡ c
 
Input
첫 줄 의 정수
T, 표시
T 조 데이터.
각 조 의 테스트 데 이 터 는 한 줄 을 차지 하고 네 개의 숫자 를 포함한다.
x,m,k,c
1≤x≤9  
1≤m≤1010
0≤c 
Output
각 그룹의 데이터 에 대해 두 줄 을 출력 합 니 다:
첫 번 째 줄 출력: "Case \ # i:".
대표
i 조 테스트 데이터.
두 번 째 줄 은 'Yes' 나' No '를 출력 하고 네 개의 숫자 를 대표 하 며 제목 에서 준 공식 을 만족 시 킬 수 있 습 니까?
/*
                10 10      ,        ,            m k   
f=f*10+k
             [k,1]* [10 0] m-1  
				[x  1]
*/
#include <cstdio>
#include <iostream>

using namespace std;
typedef __int64 ll;
ll m;
int k,mod,c;

struct matrix
{
    int m[2][2];
}ans, base;

matrix multi(matrix a, matrix b)
{
    matrix tmp;
    for(int i = 0; i < 2; ++i)
    {
        for(int j = 0; j < 2; ++j)
        {
            tmp.m[i][j] = 0;
            for(int k = 0; k < 2; ++k)
                tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % mod;
        }
    }
    return tmp;
}
int fast_mod(ll n)  //     base    n    
{
    base.m[0][0] = 10;
	base.m[0][1] = 0;
	base.m[1][0] = k;
    base.m[1][1] = 1;
    ans.m[0][0] = ans.m[1][1] = 1;  // ans          
    ans.m[0][1] = ans.m[1][0] = 0;
    while(n)
    {
        if(n & 1)  //   ans *= t;       ans    tmp,    ans = tmp * t 
        {
            ans = multi(ans, base);
        }
        base = multi(base, base);
        n >>= 1;
    }
    return ans.m[0][0]*k+ans.m[1][0];
}

int main()
{
	int t,cas=1;
	scanf("%d",&t);
	while(t--)
	{
		printf("Case #%d:
",cas); cas++; scanf("%d%I64d%d%d",&k,&m,&mod,&c); ll ans=(fast_mod(m-1)+mod)%mod; if(ans==c) printf("Yes
"); else printf("No
"); } return 0; }

좋은 웹페이지 즐겨찾기