HihoCoder1663双阶乘的末尾数字([Offer收割]编程练习赛40)(暴力||数学)

Posted ---学习ing---

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HihoCoder1663双阶乘的末尾数字([Offer收割]编程练习赛40)(暴力||数学)相关的知识,希望对你有一定的参考价值。

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定正整数x和k,判断是否存在正整数1 ≤ y ≤ x使得x与y同奇偶且(x!!)/(y!!)的个位数字为k。

其中x!! = x × (x-2) × …。

如果存在这样的y,你需要输出最大的一个,如果不存在这样的y,你需要输出-1。

输入

第一行一个正整数T,表示组数。

接下来T行,每行两个正整数x和k。

对于30%的数据1 ≤ T ≤ 3, 1 ≤ x ≤ 30, 0 ≤ k ≤ 9

对于70%的数据1 ≤ T ≤ 100, 1 ≤ x ≤ 1000, 0 ≤ k ≤ 9

对于100%的数据1 ≤ T ≤ 1000, 1 ≤ x ≤ 1000000000000000000, 0 ≤ k ≤ 9

输出

对于每组数据,输出一个整数表示答案。

样例输入
2
3 1
7 6
样例输出
3
-1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int main()
{
    long long ans,a,b,i,j,T,x,k,cnt;
    bool flag;
    scanf("%lld",&T);
    while(T--){
       scanf("%lld%lld",&x,&k);
       if(k==1) {
            printf("%lld\n",x);
            continue;
       }
       ans=1;flag=false;cnt=0;
       for(i=x;i>0;i-=2){
            cnt++;
            if(cnt>100) break;
            if(ans==k) {
                printf("%lld\n",i);flag=true;
                break;
            }
            ans=ans*i%10;
       }
       if(!flag) printf("-1\n");
    } return 0;
}

 

以上是关于HihoCoder1663双阶乘的末尾数字([Offer收割]编程练习赛40)(暴力||数学)的主要内容,如果未能解决你的问题,请参考以下文章

请问计算n的阶乘末尾有多少个0

计算n的阶乘末尾有多少个0

计算n的阶乘(n!)末尾0的个数

N的阶乘末尾有多少个0

求N!末尾所得数字0的个数

LeetCode 793 阶乘函数后K个零