栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

P1050 [NOIP2005 普及组] 循环 day16

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

P1050 [NOIP2005 普及组] 循环 day16

 又是一道题做了几个小时

非常痛苦啊!

其实我最开始就理解了题意 可是就是一直没想到要和原数组乘一下才行

非常弱智啊!!!

这道题其实真的非常简单

我们可以按位来获取每一位复原需要的步数

然后乘起来就 错误 了!!!

其实题解十次怎么来的我也不知道

最开始以为用容斥定理可以证明其有一个循环

但是我打表发现并不是这样

12^n 10以内第二位都不是1 而 第15位是1

这样我们就不得不把我们的v1更新成v2 也就是带上之前算的位数

然后来加判断是否

其实类似于迭代加深

但是10是猜的

可是我们要注意的一点就是

无论你需要多少的步数 都是在原来的基础上 加上 乘起来的步数来check

#include 
using namespace std;
const int N = 18;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl 'n'
#define Endl 'n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x mul(vector A, vector B,int r){
    vector C(A.size() + B.size());
    for (int i = 0; i < A.size(); i ++ )
        for (int j = 0; j < B.size(); j ++ )
            C[i + j] += A[i] * B[j];
    for (int i = 0, t = 0; i < C.size() || t; i ++ ){
        t += C[i];
        if (i >= C.size()) C.push_back(t % 10);
        else C[i] = t % 10;
        t /= 10;
    }
    while (C.size() > 1 && !C.back()) C.pop_back();
    while(C.size()>r)C.pop_back();
    return C;
}
signed main() {
    fast
    string s; cin >> s;
    vector v;
    int k; cin >> k;
    int n = s.size();
    for (int i = n - 1; i >= n - k; i--)v.push_back(s[i] - '0');
    vector v1 = v;
    vector v2 = v;
    vector ans;
    ans.push_back(1);
    for (int i = 0; i < k; i++) {
        if(mul(v,v2,k)[i]==v[i])continue;
        int u=1;
        do{
            v2=mul(v1,v2,k),++u;
            if(u>10){cout<<-1<v3;
        v3.push_back(u);
        ans=mul(ans,v3,1e9);
    }
    for(int i=ans.size()-1;i>=0;i--)cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005167.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号