【XJOI 训练1】友好数对

如果一个数a能由一个数b旋转得到,那么我们称为友好数对,如12345和45123为友好数对,12345和54321不为友好数对。给出两个正整数L,R,求有多少友好数对,满足L<=a

 

输入格式:

第一行一个整数T,表示数据组数,每组数据两个正整数L,R。

 

输出格式:

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

 

样例输入:

4
1 9
10 40
100 500
1111 2222

 

样例输出:

0
3
156
287

 

数据范围:

对于30%的数据满足L,R<=1000
对于100%的数据满足L,R<=2000000,T<=30,L,R位数相同。

 

时间限制:

2S

 

空间限制:

256M

 

提示:

remove!!!

 

 

题解:(题目写了题解,好人性化!我喜欢XJOI)我们枚举范围内的所有数,并求出含有当前数的数对个数。
但某些数可能产生重复,如1212,这种情况下,我们只要在旋转到与原数一样时跳出循环即可。

#include <cstdio>
#include <string>
using namespace std;
int T,L,R,ans,n;
int s[22]={1};
bool v[2000002];

int funny(int x){
    int k=0,p=x;
    for(int i=1;i<n;i++){
        x=(x%s[n-1])*10+(x/s[n-1]);
        if(x>p&&x<=R) k++;
        if(x==p) break;
    }
    return k;
}
int main(){
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    scanf("%d",&T);
    for(int i=1;i<=10;i++)
        s[i]=s[i-1]*10;
    while(T--){
        scanf("%d %d",&L,&R);
        ans=n=0;
        for(int i=L;i;i/=10) n++;
        for(int i=L;i<=R;i++)
            ans+=funny(i);
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11816933.html