码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #332 (Div. 2) D. Spongebob and Squares(枚举)

时间:2017-11-20 13:27:22      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:targe   div   res   scanf   ret   href   com   lld   scan   

 http://codeforces.com/problemset/problem/599/D

题意:
给出一个数x,问你有多少个n*m的网格中有x个正方形,输出n和m的值。

 

思路:

易得公式为:$\sum_{i=0}^{n}(n-i)(m-i) $

化简得:$\left [ n(n+1)-\frac{n(n+1)}{2}\right ]*m+\frac{n(n+1)(n+2)}{6}-\frac{n(n+1)}{2}*n$

将n作为小的数,枚举n即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<cmath>
 5 using namespace std;
 6 
 7 typedef long long ll;
 8 typedef pair<ll,ll> pll;
 9 
10 ll x;
11 vector<pll> ans1,ans2;
12 
13 int main()
14 {
15     //freopen("in.txt","r",stdin);
16     ll tot = 0;
17     scanf("%lld",&x);
18     for(ll n=1;;n++)
19     {
20         ll a = n*(n+1) - n*(n+1)/2;
21         ll b = n*(n+1)*(2*n+1)/6 - n*n*(n+1)/2;
22         if(b > x)  break;
23         if((x  - b)%a == 0)
24         {
25             ll m = (x - b)/a;
26             if(m<n)  continue;
27             ans1.push_back(make_pair(n,m));
28             tot++;
29             if(m!=n)
30             {
31                 ans2.push_back(make_pair(m,n));
32                 tot++;
33             }
34         }
35     }
36     printf("%lld\n",tot);
37     for(int i=0;i<ans1.size();i++)
38     {
39         printf("%lld %lld\n",ans1[i].first,ans1[i].second);
40     }
41     for(int i=ans2.size()-1;i>=0;i--)
42     {
43         printf("%lld %lld\n",ans2[i].first,ans2[i].second);
44     }
45     return 0;
46 }

 

Codeforces Round #332 (Div. 2) D. Spongebob and Squares(枚举)

标签:targe   div   res   scanf   ret   href   com   lld   scan   

原文地址:http://www.cnblogs.com/zyb993963526/p/7865313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!