首页 > 代码库 > HDU 5512 Pagodas(等差数列)
HDU 5512 Pagodas(等差数列)
题目戳这
题意:给你三个数:n,a,b,一开始一个集合里面有两个数:a和b,然后两个人轮流往这个集合里面增加数字,增加的这个数字的原则是,这个集合里面任选两个数的和或差,集合里面的数字不能重复,同时这个数字不能大于 n 。(本来说的造塔,这样说方便一点)
思路:本来还以为是博弈,但是后来把数字的加减都模拟一遍之后发现,无论怎样,最后得到的这个集合里面的数列,其实是一个等差数列,所以这就简单了,由一开得到的 a 和 b 来相减,然后不断地取最小的两个数相减,然后等到等差数列的差,这个差同时也是等差数列一开始的那个数字,然后拿 n 除以这个差就是在 n 的范围内可以得到的数字的个数了,然后因为分先手和后手,所以最后只要判断一下个数的奇偶数就可以得到答案了。
P.S.这道题又犯傻了,明明都已经找到规律了,结果还想着二分,明明拿个 n 除以那个差就好了······
1 #include<stdio.h> 2 #include<iostream> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<vector> 7 #include<string> 8 #include<queue> 9 #include<map>10 #include<stack>11 #include<set>12 #define ll long long13 #define PI acos(-1.0) //圆周率14 const int mod=1e9+7;15 const int maxn=1e6+10;16 using namespace std;17 int T,n,a,b;18 int max(int l,int r)19 {20 if(l>r) return l;21 else return r;22 }23 int min(int l,int r)24 {25 if(l>r) return r;26 else return l;27 }28 int main()29 {30 int cas=0;31 scanf("%d",&T);32 while(T--)33 {34 scanf("%d %d %d",&n,&a,&b);35 36 if(a<b) swap(a,b);37 int cnt=0;38 while(1)39 {40 cnt=a-b;41 42 if(b==cnt) break;43 44 a=max(b,cnt);45 b=min(b,cnt);46 }47 48 int ans=n/cnt;49 50 printf("Case #%d: ",++cas);51 if(ans%2==0) printf("Iaka\n");52 else printf("Yuwgna\n");53 }54 55 return 0;56 }
HDU 5512 Pagodas(等差数列)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。