A. Consecutive Sum Riddle
题意:找到一个等差数列的第一项和最后一项 使得这个等差数列的前n项和为n
说实话一开始没直接想到 直接拿数列前n项和 算出项数和 n的关系 发现方程有l和r两个未知数 无法直接确定
思路其实是:观察一下样例写出这样的式子 比如 当n=5 我们可以写成 {-4 -3 -2 -1 0 1 2 3 4 5}惊奇的发现其实只需要保留n即让n作为r左边界剩下的部分看成正的一部分和负的一部分 正负相抵即可
因此右边界为 $r=n$ 左边界就是 $l=-(n-1)$
AC代码:
#include<bits/stdc++.h>
#pragma optimize(2)
#define x first
#define y second
using namespace std;
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
int lcm(int a,int b){ return a/gcd(a,b)*b; }
typedef long long LL;
typedef pair<int,int>PII;
const int N=2e5+10;
int father[N];
int find(int x)
{
father[x]==x?x:father[x]=find(father[x]);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)
{
LL n;cin>>n;
cout<<-(n-1)<<' '<<n<<endl;
}
return 0;
}
时间复杂度$O(1)$
B. Special Numbers
题意:在n进制下各个位只能是0或者1的第k个这样的n进制数 转成10进制后为n
思路:由于完全是n的某一个次幂而没有别的数 说明n进制下 每一位除去第一位以外 其它位只能是0或者1
直接想到考虑用二进制的方式来做 考虑到为1的为 就加上当前为1的这为表示的是10进制下的多少 最后全部相加即可
实质上是把k看成一个二进制数 再用这个二进制数转成10进制的时候乘的不是2的power而是n的power
注意用快速幂来处理下不然直接爆int了注意答案开LL
AC代码:
#include<bits/stdc++.h>
#pragma optimize(2)
#define x first
#define y second
using namespace std;
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
int lcm(int a,int b){ return a/gcd(a,b)*b; }
typedef long long LL;
typedef pair<int,int>PII;
const int N=2e5+10;
const int mod=1e9+7;
int father[N];
int find(int x)
{
father[x]==x?x:father[x]=find(father[x]);
}
LL qpow(int a,int b)
{
LL res=1%mod;
while(b)
{
if(b&1)res=(1LL*res*a)%mod;
a=1LL*a*a%mod;
b>>=1;
}
return res;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
// freopen("test.in","r",stdin);
int t;
cin>>t;
while(t--)
{
LL n,k;
cin>>n>>k;
LL ans=0;
for(int i=0;k>>i;i++)
{
if(k>>i&1)ans+=qpow(n,i);
}
cout<<ans%mod<<endl;
}
return 0;
}
$O(logk*logk)$
C. Make Them Equal
题意:通过给定的操作使得给定字符串的每一个字符都变成给定字符 求最小的操作次数
思路:模拟
#include<bits/stdc++.h>
#pragma optimize(2)
#define x first
#define y second
using namespace std;
int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }
int lcm(int a,int b){ return a/gcd(a,b)*b; }
typedef long long LL;
typedef pair<int,int>PII;
const int N=2e5+10;
const int mod=1e9+7;
int father[N];
char s[N];
int find(int x)
{
father[x]==x?x:father[x]=find(father[x]);
}
bool is_prime(int x)
{
if(x<2)return false;
for(int i=2;i<=x/i;i++)
if(x%i==0)return false;
return true;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
// freopen("test.in","r",stdin);
int t;cin>>t;
while(t--)
{
int n;cin>>n;
char c;cin>>c;
cin>>s+1;
bool flag=true;
for(int i=1;i<=n;i++)
if(s[i]!=c)
{
flag=false;
break;
}
if(flag)//如果已经是了不需要操作
{
cout<<'0'<<endl;
continue;
}else
{
if(s[n]==c)cout<<'1'<<endl<<n<<endl;//如果有不是的且n是
else//s[n]!=c 如果有不是的且 n也不是
{
int res=0;
for(int i=n;i>=1;i--)
{
if(s[i]==c)
{
res=i;//一直找到是的
break;
}
}
if(res==0)//全不等
{
cout<<'2'<<endl;
cout<<n-1<<' '<<n<<endl;
continue;
}
if(res==1)
{
cout<<'2'<<endl;
cout<<n-1<<' '<<n<<endl;
continue;
}
if(n%res==0)cout<<'2'<<endl<<res<<' '<<n-1<<endl;//如果n是
else
{
bool flag=false;
for(int i=res;i<=n;i+=res)
{
if(s[i]!=c)
{
flag=true;
break;
}
}
if(flag)
{
cout<<'2'<<endl;
cout<<res<<' '<<n<<endl;
}
else
{
cout<<'1'<<endl;
cout<<res<<endl;
}
}
}
}
}
return 0;
}
求个D QAQ