题目链接:http://codeforces.com/contest/1062
A 题
题意:给你一个升序序列,问你最多删除多少个,还可以让那个人复原回来。
思想:想复原只有1到一个数或者一个数到1000或者中间一段距离,对于前两者最长就是长度-1 后者就是长度-2.
B题
题意:给你一个n问你可以通过*X或者开根号(能够正好开),求算出来的最小的数和最小的次数
思想:最小数的那个数肯定是n的素因子的乘积,所以就算一下n的素因子,然后考虑将每个因子一步乘到2^x次方,然后一直开根号就行。
#include
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
ll a[maxn];
int main()
{
ll n,m,Min=1;
int ans=0,k=0;
scanf("%lld",&n);
m=n;
ll temp = sqrt(n);
for(int i=2;i<=temp;i++)
{
if(n%i==0)
{
int sum=0;
while(n%i==0)
{
a[k]++;
sum++;
n=n/i;
}
Min*=i;
ans=max(ans,sum);
k++;
}
}
if(n>1)
{
Min*=n;
a[k++]++;
}
if(ans<=1)
{
printf("%lld %d\n",m,0);
return 0;
}
ll sum=1;
int cnt=0;
while(sum
C
题意:给你一个01串有q次询问,每次问你一个区间如何弄让按个值最大,假如你当前获得Xi,那么区间没有被拿的数都增加xi。
思想:贪心,推公式,写一下发现1的是一个以1为开始等比为2的序列,0的就是1最大的那个序列减1,0也变成了一个等比为2的序列。求和即可。需要特判下全0的情况。
#include
using namespace std;
const int maxn=1e5+10;
const long long mod = 1e9+7;
typedef long long ll;
int ans[maxn];
char str[maxn];
ll Qpow(ll a,int b)
{
ll ans=1;
while(b)
{
if(b&1)
ans=(ans*a)%mod;
a=(a*a)%mod;
b=b/2;
}
return ans;
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
scanf("%s",str);
for(int i=0;i
D
题意:给你一个n问你有多少个序列对满足1< |a| |b| <=n 问你有多少满足的序列。(我大概理解的就是这样,如果不对请指正)
同时满足a*x=b 或者 b*x=a |x|>1
思想:暴力枚举a x 就可以发现对于每个满足的值它的绝对值会出现4次 比如 (2,2) (2,-2) (-2,2) (-2,-2)
所以暴力枚举就行了
#include
using namespace std;
typedef long long ll;
int main()
{
ll n;
scanf("%lld",&n);
ll ans = 0;
for(int i=2;i<=n;i++)
for(int j=2;j*i<=n;j++)
ans=ans+(j*4);
printf("%lld\n",ans);
return 0;
}