标签:ace 描述 using ring div break c/c++ accept 空格
内存限制:64MB
时间限制:3000ms
Special Judge: No
accepted:1
submit:3
第一行输入一个整数N(0<n<10);接下来每组测试数据输入只有一行,包含两个整数n(1 <= n <100000)和k(1 <= k <= 5),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。
每组测试数据输出包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。
1 32 2
4
分析:
ps:
1、是存在结果不循环这种情况
2、emmmmmm, 数据超过int, 用long long才可以AC
1、因为题目要求的是最后k位是否循环,所以在做相乘的时候自需要取出最后k位的数与给定的数n相乘
2、如果在最后取出的数与不是第一位的数位对应上的数相等了,说明只存在局部循环,不存在全局循环(这就是跳出循环的条件,<set>判重)
核心代码:
1 while(my_begin != my_end) 2 { 3 temp *= n; 4 my_end = temp % A[k]; 5 temp = my_end; 6 my_set.insert(temp); 7 if(!pr.second) 8 { 9 flag = 1; 10 break; 11 } 12 }
C/C++代码实现(AC):
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cmath> 6 #include <stack> 7 #include <map> 8 #include <queue> 9 #include <set> 10 11 using namespace std; 12 const int MAXN = 10010; 13 const int MAX = 0x3f3f3f3f; 14 int A[7] = {1, 10, 100, 1000, 10000, 100000}; 15 16 int main() 17 { 18 19 int t; 20 scanf("%d", &t); 21 22 while(t --) 23 { 24 set <long long> my_set; 25 pair <set <long long> ::iterator, bool> pr; 26 long long n, k, cnt = 0, my_begin, temp_n, my_end, flag = 0; 27 scanf("%d%d", &n, &k); 28 temp_n = n, my_begin = n % A[k]; 29 while(my_begin != my_end) 30 { 31 cnt ++; 32 temp_n *= n; 33 my_end = temp_n % A[k]; 34 temp_n = my_end; 35 pr = my_set.insert(temp_n); 36 if(!pr.second) 37 { 38 flag = 1; 39 break; 40 } 41 } 42 if(!flag) 43 printf("%lld\n", cnt); 44 else 45 printf("-1\n"); 46 } 47 return 0; 48 }
标签:ace 描述 using ring div break c/c++ accept 空格
原文地址:https://www.cnblogs.com/GetcharZp/p/9107439.html