Ural1209(数学推导)

题目链接:点击打开链接

解题思路:

此题甚好。推导公式,首先观察序列110100100010000·····,我们把为1的下标单独拿出来看。依次为1、2、4 、7、 11·····,,可以分解为1+(0) 、1+(0+1)、1+(0+1+2)、1+(0+1+2+3)、1+(0+1+2+3+4),可以推导出规律1 + x * (x – 1) / 2。

那么对于每个n,我们只要判断是否存在x使n == 1 + x * (x – 1) / 2即可。对于最后判断开根号是否为整数的判断方法,我们可以用temp – (int)temp == 0来判断,此法甚妙!

完整代码:

#include <algorithm>#include <iostream>#include <cstring>#include <climits>#include <cstdio>#include <string>#include <cmath>#include <map>#include <queue>using namespace std;typedef long long LL;const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const double EPS = 1e-9;const double PI = acos(-1.0); //M_PI;const int maxn = 700001;int ans[maxn];int main(){#ifdef DoubleQfreopen("in.txt","r",stdin);#endifint T;cin >> T;LL n;int cnt = 0;for(int i = 0 ; i < T ; i ++){cin >> n;double temp = sqrt(1 + 8 * (n – 1));if(temp – (int)temp == 0)ans[cnt++] = 1;elseans[cnt++] = 0;}for(int i = 0 ; i < cnt ; i ++)printf("%d%s" , ans[i] , i == cnt – 1 ? "\n" : " ");}

更多精彩请访问:点击打开链接

接受失败也等于给了自己从零开始的机会,接受失败更是一种智者的宣言和呐喊;

Ural1209(数学推导)

相关文章:

你感兴趣的文章:

标签云: