A.Consecutive Sum Riddle
题目大意: 给定整数,求一个
使得
。
思路:脑筋急转弯。看看数据范围就知道了对于输入的,令
即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t = 0; cin >> t;
while(t--){
int n = 0; cin >> n;
cout << 1 - n << ' ' << n << endl;
}
return 0;
}
B.Special Numbers
题目大意: 给定,问用一些不同
的幂次项求和得出的数列中,从小到大第
个的值。
思路: 先用组合数学来找规律:
可见分类呈样递增。不妨联想到二进制,简单模拟一下规律可知,实际上就是二进制进位的过程。那么只需要按照该规律,对二进制表示为
的位计算幂次累加至总和中即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 1e9 + 7;
int binpow(int a, int b, int m) {
a %= m;
int res = 1;
while (b > 0) {
if (b & 1) res = res * a % m;
a = a * a % m;
b >>= 1;
}
return res;
}
signed main(){
int t = 0; cin >> t;
while(t--){
int n = 0, k = 0, ans = 0, cnt = 0; cin >> n >> k;
while(k){
if(k & 1) ans += binpow(n, cnt, MOD), ans %= MOD;
k >>= 1, cnt++;
}
cout << ans % MOD << endl;
}
return 0;
}