H
题意:给定数组元素的个数n和元素的和为m,求在各元素异或最大的情况下,数组共有多少种情况。
思路:由异或的性质可知,因为各元素的和是m,先把m转化为二进制,要使各元素异或最大,就要让各元素在二进制下相同位上不能出现重复的1。m在二进制下的每一个1都可以放在n个位置上。只需要统计m在二进制下有多少个1,方案数即为
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx = 1e4 + 10;
const int mod=1e9+7;
ll n,m;
void solve()
{
scanf("%lld %lld",&n,&m);
ll cnt=0;//统计m在二进制下1的个数
while(m)
{
cnt+=m%2;
m/=2;
}
ll ans=1;
n%=mod;
for(int i=1;i<=cnt;i++)
{
ans=ans*n%mod;
}
printf("%lld",ans);
}
int main()
{
int _t=1;
//scanf("%d", &_t);
while (_t--)
{
solve();
}
system("pause");
}
K
思路:因为每次击完球都需要回到位置5,而站在位置5上击球不算经过。对于位置5经过的次数就是总击球次数-站在位置5上击球的次数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx = 1e5 + 10;
int n;
int vis[15];
string s;
void solve()
{
cin>>s;
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]=='1') vis[1]++;
else if(s[i]=='2') vis[2]++;
else if(s[i]=='3') vis[3]++;
else if(s[i]=='4') vis[4]++;
else if(s[i]=='5') vis[5]++;
else if(s[i]=='6') vis[6]++;
else if(s[i]=='7') vis[7]++;
else if(s[i]=='8') vis[8]++;
else if(s[i]=='9') vis[9]++;
}
for(int i=1;i<=9;i++)
{
if(i==5)
{
printf(" %d",len-vis[5]);
}
else if(i==1) printf("%d",vis[i]);
else printf(" %d",vis[i]);
}
}
int main()
{
int _t=1;
//scanf("%d", &_t);
while (_t--)
{
solve();
}
//system("pause");
}