大数据分析网站,wordpress密码破解,外包做网站平台 一分钟,广州白云区最新信息题目描述
你曾经因为看见一样的东西一遍又一遍地重复、循环而对电视节目感到厌烦么#xff1f;好吧#xff0c;虽然我并不关心电视节目的好坏#xff0c;不过有时却也很像那样不断循环的数字。
让我们假定两个不同的正整数 (n,m) 是循环的#xff0c;当且仅当你能通过将 …题目描述
你曾经因为看见一样的东西一遍又一遍地重复、循环而对电视节目感到厌烦么好吧虽然我并不关心电视节目的好坏不过有时却也很像那样不断循环的数字。
让我们假定两个不同的正整数 (n,m) 是循环的当且仅当你能通过将 n 末端的几个数字移到它的首端而不改变移动的数字的顺序并使整个数字变成 m 。举个例子(12345,34512) 就是一对循环的数字因为你能把 12345 中末尾的 345 移到 12 前面从而得到 34512。注意为了成为一对循环的数字n 和 m 位数必须相同。无论 n 或 m 都没有前置的 0。
现在给定正整数 A 和 B并保证 A 和 B 位数相同且均没有前置 0求存在多少循环的正整数对 (n,m)使得 A≤n≤m≤B
输入格式
本题有共有 10 个测试点。 每个输入文件包含 1 行。 第 1 行有两个用空格隔开的正整数 A 和 B。
输出格式
每个输出文件应包含一个正整数 x表示共有 x 组循环的正整数对 (n,m) 使得 A≤n≤m≤B。
输入输出样例
输入 #1 1111 2222 输出 #1 287 说明/提示
1≤A,B≤2×10^6。
思路
模拟可过。
对于题目中描述的几个操作分别解决然后直接调用即可得到答案。 我们可以选择把数字转换成字符串处理。其实是不想去想怎么循环数字 数字转字符串很简单可以直接用一个while循环解决。 代码如下 while(k)s[l]k%100,k/10; 这样我们是倒序存入的所以字符串转数字稍微麻烦一点 inline int toi(int l){ R int k0;for(R int il-1;i0;i--)kk*10s[i]-0;return k;
}现在对于循环进行处理。 注意1. 数字首位不为零如果为零就继续下一个。 2. 这里的循环按照题目定义不能用next_permutation inline int nxt(int l,int k){s[l]s[0];for(R int i0;il;i)s[i]s[i1];if(s[0]0)return nxt(l,k); if(toi(l)!k)return 1;return 0;
}按照题目描述从 A 到 B 枚举每一个数字判断能够组成多少个符合要求的正整数对。 inline int ck(int k){R int l0,t,fk;while(k)s[l]k%100,k/10;while(nxt(l,f)){ttoi(l);if(tftm!vis[t])k;}return k;
}
完整代码
#include bits/stdc.h
using namespace std;
int n,m,ans;
bool vis[2000001];
char s[100];
int read(){int x0;char cgetchar();//freopen(a.in,r,stdin);while(c9||c0)cgetchar();while(c0c9){x(x1)(x3)(c^48);cgetchar();//freopen(b.in,r,stdin);}return x;
}
int toi(int l){int k0;for(int il-1;i0;i--)kk*10s[i]-0;return k;
}
int next(int l,int k){s[l]s[0];for(int i0;il;i)s[i]s[i1];if(s[0]0)return next(l,k);if(toi(l)!k)return 1;return 0;
}
int ck(int k){int l0,t,fk;while(k)s[l]k%100,k/10;while(next(l,f)){ttoi(l);if(tftm!vis[t])k;}return k;
}
int main(){nread();mread();for(int in;im;i){vis[i]1;ansck(i);}coutansendl;//freopen(c.out,w,stdout);return 0;
}