最近越来越菜了 A,B题都写这么慢, 我是fw
题意: 从 l l l 起到 r r r 止的等差数列的和为 n n n, 请求出 l l l和 r r r
分析: 由等差数列求和公式
(
l
+
r
)
(
r
−
l
+
1
)
/
2
=
n
(l + r) ( r - l + 1) / 2 = n
(l+r)(r−l+1)/2=n
可以令
l
+
r
=
=
1
l + r == 1
l+r==1
然后
l
=
r
−
1
l = r - 1
l=r−1, 代入得,
l
=
1
−
n
,
r
=
n
l = 1 - n, r = n
l=1−n,r=n
#include<bits/stdc++.h>
#define x first
#define y seoncd
#define int long long
#define gg exit(0);
#define sf1(x) scanf("%lld",&x)
#define sf2(x,y) scanf("%lld%lld",&x,&y)
#define pr1(x) printf("%lld\n", x)
#define pr2(x, y) printf("%lld%lld\n", x, y)
#define debug printf("debug\n");
const int N = 3e5 + 10;
using namespace std;
typedef pair<int, int>PII;
int t, n, a[N];
void solve()
{
cin >> n;
cout << 1 - n << " " << n << '\n';
}
signed main()
{
//t = 1;
scanf("%lld", &t);
while(t -- )
solve();
}
题意
T
h
e
o
f
a
n
i
s
Theofanis
Theofanis 非常喜欢正整数序列,因此他的老师
(
Y
e
l
t
s
a
K
c
i
r
)
(Yeltsa Kcir)
(YeltsaKcir)给了他一个关于一个仅由特殊数字组成的序列的问题。
我们称一个正数为特殊的如果它可以被写成
n
n
n 的不同非负幂的和. 例如,对于
n
=
4
,
17
n = 4, 17
n=4,17 是特殊的,因为它可以写成
4
0
+
4
2
=
1
+
16
=
17
4^0 + 4^2 = 1 + 16 = 17
40+42=1+16=17,但
9
9
9 不是。
Theofanis要求你帮他找到第
k
k
k 个特殊数,如果它们是递增排序的。因为这个数可能太大了,所以输出它对
1
0
9
+
7
10^9+7
109+7 取模。
分析:
x
0
x^0
x0 对应的十进制数
1
1
1 二进制数
01
01
01
x
1
x ^1
x1 对应的十进制数
2
2
2 二进制数
10
10
10
x
0
+
x
1
x ^ 0 + x^1
x0+x1 对应的十进制数
3
3
3 二进制数
11
11
11
x
2
x^2
x2 对应的十进制数
4
4
4 二进制数
100
100
100
x
2
+
x
0
x^2 + x^0
x2+x0 对应的十进制数
5
5
5 二进制数
101
101
101
x
2
+
x
1
x^2 + x^1
x2+x1 对应的十进制数
6
6
6 二进制数
110
110
110
x
2
+
x
1
+
x
0
x^2 + x^1 + x^0
x2+x1+x0 对应的十进制数
7
7
7 二进制数
111
111
111
x
3
x^3
x3 对应的十进制数
8
8
8 二进制数
1000
1000
1000
然后就能发现规律 第 k k k 个数对应的二进制中哪一位有 1 1 1,就加上 n n n 的这一位的次幂
#include<bits/stdc++.h>
#define x first
#define y seoncd
#define int long long
#define gg exit(0);
#define sf1(x) scanf("%lld",&x)
#define sf2(x,y) scanf("%lld%lld",&x,&y)
#define pr1(x) printf("%lld\n", x)
#define pr2(x, y) printf("%lld%lld\n", x, y)
#define debug printf("debug\n");
const int N = 3e5 + 10, mod = 1e9 + 7;
using namespace std;
typedef pair<int, int>PII;
int t, n, a[N];
int qmi(int a, int b) //快速幂
{
int res = 1;
while(b)
{
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
void solve()
{
int n, k, res = 0;
cin >> n >> k;
for(int i = 0; i < 31; i ++ )
if(k >> i & 1) //取出每一个1
res = (res + qmi(n, i)) % mod; //加上这一位的次方
cout << res << '\n';
}
signed main()
{
//t = 1;
scanf("%lld", &t);
while(t -- )
solve();
}
题意:
T
h
e
o
f
a
n
i
s
Theofanis
Theofanis 有一个字符串
s
1
,
s
2
…
s
n
s_1,s_2…s_n
s1,s2…sn 和一个字符
c
c
c。他想用最小的操作次数使字符串中的所有字符都等于
c
c
c。
在一个操作中,他可以选择一个数字
x
(
1
≤
x
≤
n
)
x(1≤x≤n)
x(1≤x≤n),对于每个位置
i
i
i,当
i
i
i 不能被
x
x
x 整除时,用
c
c
c 替换
s
i
s_i
si。
找出使所有字符等于
c
c
c 和
x
x
x 的最小操作数,他应该在操作中使用。
题意: 如果这一位的下标能被 x x x 整除, 则直接替换成 字符 c c c, 要全部替换成 c c c, 首先最多需要的次数是两次, 因为 x = n x = n x=n, 可以替换前 n − 1 n - 1 n−1 个字符, x = n − 1 x = n - 1 x=n−1 可以替换掉第 n n n 个字符, 然后现在需要分析 0 0 0 次和 1 1 1 次的
如果某一个位置的整数倍都是
c
c
c, 那么直接除这个位的下标即可
如果全部位置都是
c
c
c, 输出
0
0
0
#include<bits/stdc++.h>
#define x first
#define y seoncd
#define int long long
#define gg exit(0);
#define sf1(x) scanf("%lld",&x)
#define sf2(x,y) scanf("%lld%lld",&x,&y)
#define pr1(x) printf("%lld\n", x)
#define pr2(x, y) printf("%lld%lld\n", x, y)
#define debug printf("debug\n");
const int N = 3e5 + 10;
using namespace std;
typedef pair<int, int>PII;
int t, n, a[N];
char s[N];
void solve()
{
int n, flag = 0;
char a;
cin >> n >> a;
scanf("%s", s + 1);
for(int i = 1; i <= n; i ++ )
if(s[i] != a)
{
flag = 1;
break;
}
if(!flag) cout << "0\n"; //全部相同
else
{
int flag2 = 0;
for(int i = 2; i <= n; i ++ )
{
bool flag1 = 1;
for(int j = i; j <= n; j += i) //整数倍的i
if(s[j] != a)
{
flag1 = 0;
break;
}
if(flag1) //可以直接除这一位
{
flag2 = i;
break;
}
}
if(!flag2)
cout << "2\n" << n - 1 << " " << n << '\n';
else cout << "1\n" << flag2 << '\n';
}
}
signed main()
{
//t = 1;
scanf("%lld", &t);
while(t -- )
solve();
}