【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\n",ans); } return 0; }