首页 > 代码库 > 2017-03-19 codeforces 664C 找规律,水
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 0x3f3f3f3ftypedef 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\n", s2+s4); } return 0;}
2017-03-19 codeforces 664C 找规律,水
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。