[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∼4 | 105 | 100 | 2×105 |
| 5∼6 | 1010 | 0 | 0 |
| 7∼8 | 1010 | 0 | 2×105 |
| 9∼12 | 1010 | 20 | 0 |
| 13∼16 | 1010 | 20 | 2×105 |
| 17∼18 | 109 | 2×105 | 2×105 |
| 19∼20 | 1010 | 2×105 | 2×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;
}

浙公网安备 33010602011771号