B. Math
B就是要找n这个数的所有质因子 将所有出现过的质因子都乘一次就可以得出正确答案了
至于操作次数ans则分为4种情况来讨论 n可以进行n=sqrt(n)或者n=n*x(x为任意正数)这两种操作的任意一种
唯一值得注意的是 判断一个数n的log2(n)是不是整数可以采取如下方法:
bool f(int x)
{
if((x&(x-1))==0)
return true;
else
return false;
}
代码如下:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
using namespace std;
map<int,int> ma;
bool f(int x)
{
if((x&(x-1))==0)
return true;
else
return false;
}
int main (void)
{
int n;
while(cin>>n)
{
if(n==1)
{
cout<<1<<" "<<0<<endl;
continue;
}
ma.clear();
int t = n;
while(n!=1)
{
for(int i=2;i<=n;i++)
{
if(n%i==0)
{
ma[i]++;
n/=i;
break;
}
}
}
int ans = 1;
int maxx = 0;
int minn = 1e9;
for(int i=1;i<=t;i++)
{
auto it = ma.find(i);
if(it!=ma.end())
{
maxx = max(maxx,it->second);
minn = min(minn,it->second);
ans*=i;
}
}
cout<<ans<<" ";
if(maxx==minn)
{
if(f(maxx))
cout<<(int)log2(maxx)<<endl;
else
cout<<(int)log2(maxx)+2<<endl;
}
else
{
if(f(maxx))
cout<<(int)log2(maxx)+1<<endl;
else
cout<<(int)log2(maxx)+2<<endl;
}
}
return 0;
}
C. Banh-mi
题意很简单 给你一串01字符串 每次可以取走l到r区间内的一个字符 sum和其他未被取走的字符累加取走的字符的权值
要求sum的最大值为多少 比如样例:
4 2 1011 1 4 3 4
第一个样例应该这样模拟: sum = 0;
sum +=1, 122;
sum+=2;34;
sum+=4;7
sum+=7,sum = 14;所以输出的结果为14
随便找下规律就会发现其实就是求两个等比数列的和 代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAXN 100000+10
#define MOD 1000000000+7
using namespace std;
long long a[MAXN];
long long f(long long n)
{
long long ans = 1;
long long p = 2;
while(n)
{
if(n&1)
ans*=p,ans%=MOD;
p*=p,p%=MOD;
n>>=1;
}
return ans;
}
int main (void)
{
long long n,m;
while(cin>>n>>m)
{
memset(a,0,sizeof(a));
string s;
cin>>s;
for(int i=0;i<n;i++)
a[i+1] = a[i]+(s[i]-'0');
int l,r;
for(int i=1;i<=m;i++)
{
cin>>l>>r;
int num1 = a[r]-a[l-1];
int num0 = (r-l)-num1+1;
long long x = f(num1)-1;
//cout<<x<<endl;
long long sum = x;
long long y = x*(f(num0)-1);
y%=MOD;
sum+=y;
sum%=MOD;
cout<<sum<<endl;
}
}
return 0;
}