zoukankan      html  css  js  c++  java
  • 洛谷P4884 多少个1?

    (large{题目链接})
    (\)
    (Large extbf{Soluiton: } large{题意可化为求最小的n满足sum ^{n-1}limits_{i=0}10^{i}equiv kleft(mod m ight),可转化为dfrac {10^{n}-1}{9}equiv kleft(mod m ight),观察这个式子,用 ext{BSGS}求即可})
    (\)
    (Large extbf{Summary: } large{1.龟速乘可以防止爆long long。\2.膜一下tlx,比我快,空间还比 我小,orz。})
    (\)
    (Large extbf{Code:})

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    typedef long double ld;
    typedef unsigned long long ull;
    
    ll k, m;
    map <ll, ll> h; 
    
    inline ll read() {
    	ll x = 0;
    	char ch = getchar();
    	while (!isdigit(ch)) ch = getchar();
    	while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
    	return x; 
    }
    
    inline ll mul(ll x, ll y, ll p) {
    	ll z = (ld)x / p * y;
    	ll ret = (ull)x * y - (ull)z * p;
    	return (ret + p) % p;
    }
    
    int main() {
    	k = read(), m = read();
    	k = (mul(9, k, m) + 1) % m;
    	int t = ceil(sqrt(m)); ll cur = 1;
    	h[k % m] = 0;
    	for (int i = 1; i <= t; ++i) cur = mul(cur, 10, m), h[mul(cur, k, m)] = i;
    	ll ans = 1;
    	for (int i = 1; i <= t; ++i) {
    		ans = mul(ans, cur, m);
    		if (h[ans]) { printf("%lld
    ", ((1ll * i * t - h[ans]) % m + m) % m); return 0; }
    	}
    }
    
  • 相关阅读:
    软件工程课堂二
    软件工程第二周总结
    软件工程第一周开课博客
    软件工程课堂一
    开学第一次考试感想
    以Function构造函数方式声明函数
    document.scrollingElement
    标识符
    变量声明语句的提升
    用that代替this
  • 原文地址:https://www.cnblogs.com/Miraclys/p/12597263.html
Copyright © 2011-2022 走看看