整除光棍
Posted emhhbw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整除光棍相关的知识,希望对你有一定的参考价值。
题目链接:https://pintia.cn/problemsets/994805046380707840/problems/994805084284633088
题目大意:
给出光棍数定义:(如1,11,111) 而且任何一个光棍都能被一个不以5结尾的奇数整除。给出一个 x (一个不以5结尾的奇数整除) 让你输出最小的s
使得 x * s = 光棍数 ,并输出光棍数的位数。
思路:
通过题目给出的定义,很显然 x * s = 光棍数 这个式子要去变成 s = 光棍数 / x 的形式 , 这里可能想到暴力枚举光棍数的位数,但题目说明这样会超时,再回头看转换的式子,可以写一下 光棍数 / x 的情形,因为光棍数每一位都相等为1,这个可以看成一小段的111(位数不定)/ x 得到 s 的首位,后面又变成 (小段光棍数 % x) * 10 + 1, 即位数往后推1位,再进行这样的操作得到 s 的第二位,直到 取的小段光棍数被整除结束。
解题代码:
// .--------------. // | Try First One| // ‘--------------‘ // | .--------------. // | | | // V V | // .--------------. | // | AC. |<---. | // ‘--------------‘ | | // (True)| |(False) | | // .--------‘ | | | // | V | | // | .--------------. | | // | | Try Again |----‘ | // | ‘--------------‘ | // | | // | .--------------. | // ‘->| Try Next One |-------‘ // ‘--------------‘ #include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #include <cstring> using namespace std; const long long N = 1e10 + 7; const int maxn = 2e5 + 5; const long long INF = 8e18; typedef long long ll; #define for0(i,n) for(int i = 0;i < n;i++) #define for1(i,n) for(int i = 1;i <= n;i++) int main() { ll x,num = 1,temp = 1; cin >> x; while(temp < x){ temp = temp*10 + 1; //寻找一开始的除数 num++; //每次推移多一位1 } while(1){ cout << temp/x ; //开始输出s的每一位 if(temp%x == 0) break; temp = (temp%x) * 10 + 1; //推移到下一位 num++; //每次推移多一位1 } cout << " " << num << endl; return 0; }
以上是关于整除光棍的主要内容,如果未能解决你的问题,请参考以下文章