[Algo Beat Contest 002.5 C] 数数题 (count)题解

题目描述

定义 f(x) 表示将 x 的翻转后的数,例如:f(123)=321。特别的,如果 x 的末尾有 0,则忽略翻转后的前导 0,例如:f(120300)=3021。

小 D 会给你五个整数 l,r,a,b,c,请你求有多少个正整数 x∈[l,r],使得 xamodb=f(f(x)+c)。

输入格式

本题单个测试点内有多组测试数据

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

接下来 T 行,每行五个整数 l,r,a,b,c,表示一组测试数据。

输出格式

一行一个整数,表示答案。

输入输出样例

输入 #1复制运行

3
5 100 2 45 6
1 100 5 97 9
589 100425 1032 4855 4091

输出 #1复制运行

2
1
4

输入 #2复制运行

3
563 9980225344 100 23184 822
794 9982136054 19842 98213 603
1 10000000000 172455 199240 5061

输出 #2复制运行

20
11
39

说明/提示

【样例解释】

对于样例 #1 的第一组测试数据,有两个正整数满足要求,分别是 43,48。

对于样例 #1 的第二组测试数据,有且仅有 1 个正整数满足要求,为 1。

【数据范围】

测试点编号l,r≤a≤c≤
1∼41051002×105
5∼6101000
7∼8101002×105
9∼121010200
13∼161010202×105
17∼181092×1052×105
19∼2010102×1052×105

对于所有数据,保证:

  • 1≤T≤3。
  • 1≤l≤r≤1010。
  • 0≤a,c≤2×105。
  • 1≤b≤2×105。

思路

直接枚举即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long t,l,r,a,b,c,lk=0,kl=0,op=0,g[20];
long long pow2(unsigned long long a1,unsigned long long b1,unsigned long long m1){
    unsigned long long kk1=1;
    a1%=m1;
    while(b1>=1){
        if(b1%2==1){
            kk1*=a1;
        }
        b1/=2;
        a1*=a1;
        kk1%=m1;
        a1%=m1;
    }
    return kk1;
}
long long ff(long long a1){
	long long a2=a1,a3=0;
	while(a2!=0){
		a3*=10;
		a3+=(a2%10);
		a2/=10;
	}   
    return a3;
}
int main(){
	cin>>t;
    g[0]=10;
    for(int i=1;i<=18;i++){
        g[i]=g[i-1]*10;
    }
	while(t--){
		cin>>l>>r>>a>>b>>c;
		op=0;
		for(long long i=0;i<=b-1;i++){
            if((unsigned long long)i%10!=0){
                for(long long j=ff(i);ff(j-c)<=r;j*=10){
                    if(j-c>=0&&(unsigned long long)(j-c)%10!=0){
                        for(long long k=ff(j-c);k<=r;k*=10){
                            if(k>=l&&pow2(k,a,b)==i){
                                op++;
                            }
                        }
                    }
                }
            }
        }
        cout<<op<<endl;
	}
	return 0;
}

posted @ 2025-10-09 15:55  bz02_2023f2  阅读(5)  评论(0)    收藏  举报  来源