• 2017-03-19 codeforces 664C 找规律,水


    C. International Olympia

    题意:从1989年起,每一年记作IAO'y,其中y为该年份的第一个没有被占用过的后缀,比如1989记作IAO'9,1990记作IAO'0,1991记作IAO'1 ,给出n个IAO'y,求它们分别代表的年份。

    tags:好纠结的题,要理清楚。。

    可以发现一开始的10年(1989-1998)会缩成一位数,接下来100年(1999-2098)会缩成两位数,接下来1000年(2099-3098)会缩成三位数,接下来10000年(3099-13098)会缩成四位数,再往下就不用说了。

    如果一下子短路了没分析出来,也可以先暴力打出前200000年的缩写,然后对比较大的年份找规律,3099年开始规律是比较简单的,每次查询如果是这200000内的就直接回答,否则根据规律求出结果即可。

    #include<bits/stdc++.h>
    using namespace std;
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define rep(i,a,b) for (int i=a;i<=b;i++)
    #define per(i,b,a) for (int i=b;i>=a;i--)
    #define mes(a,b)  memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    typedef long long ll;
    const int N = 200005;
    
    int n;
    string s;
    ll fpow(int a, int b) {ll ans=1; for(;b;b>>=1,a*=a)if(b&1)ans*=a; return ans;}
    int main()
    {
        scanf("%d", &n);
        while(n--) {
            cin>>s;
            int len=s.size()-4, cnt=0;
            ll num=0;
            per(i,s.size()-1,4) {
                int x=s[i]-'0';
                num+=fpow(10,cnt++)*x;
            }
            ll s1=fpow(10,len), s2=1988;
            rep(i,1,len-1) s2+=fpow(10,i);
            ll s3=(s2+1)%s1;  
            ll s4=num>=s3 ? (num-s3+1) : (num+s1-s3+1);
            printf("%lld
    ", s2+s4);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    类中以双下划线開始的方法
    Dynamics CRM2016 新功能之从CRM APP中导出数据至EXCEL
    敏捷项目管理实践
    Hibernate环境搭建
    ubuntu12.04更新软件源时出现校验和不符
    修炼你自己
    http自己定义超时检測方法、主动抛出异常
    sql server 2008安装图解
    Ural 1353 Milliard Vasya&#39;s Function(DP)
    待字闺中之构造最大数分析
  • 原文地址:https://www.cnblogs.com/sbfhy/p/6597294.html
Copyright © 2020-2023  润新知