目录
1011Random
题目:1011Random
求和为(n-m)/2。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
ll npow(ll a,ll b)
{
ll c=1;
ll d=a%mod;
while(b)
{
if(b&1) c=c*d%mod;
d=d*d%mod;
b>>=1;
}
return c;
}
int main()
{
ll t;
cin>>t;
ll n,m;
while(t--)
{
cin>>n>>m;
cout<<(n-m)*npow(2,mod-2)%mod<<endl;
/*逆元:整数a,b满足a*b=1%n;则a,b互为模n意义下的逆元。 */
}
}
逆元:
费马小定理:如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p);
所以,a^ (p-2) * a=1 (mod p),即a^ (p-2)为a模p时的逆元。
求逆元:
ll npow(ll a,ll b)
{
ll c=1;
ll d=a%mod;
while(b)
{
if(b&1) c=c*d%mod;
d=d*d%mod;
b>>=1;
}
return c;
}
ll getn(ll c)
{
return npow(a,mod-2);
}
1012Alice and Bob
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[n+1];
for(int i=0;i<=n;i++)
{
cin>>a[i];
}
for(int i=n;i>0;i--)
{
a[i-1]=a[i-1]+a[i]/2;
//cout<<a[i-1]<<endl;
}
if(!a[0]) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
}
1003Backpack1003Backpack
一开始想的状态转移方程是
f[i][j][k]=max(f[i-1][j][k],f[i-1][j-v[i]][k^w[i])
题意:求背包如果能完全装满时背包中物品的值的最大异或和是多少.
#include<bits/stdc++.h>
using namespace std;
bitset<1025>f[1025],h[1025];//放在主函数里开会超时【惨痛】.
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=0;i<1025;i++)
f[i].reset();
f[0][0]=1;
int n,m;
cin>>n>>m;
int v,w;
for(int i=1;i<=n;i++)
{
cin>>v>>w;
for(int j=0;j<1025;j++)
{
h[j]=f[j];//保存上一状态.
h[j]<<=v;//<<为将物品体积左移。
}
for(int j=0;j<1025;j++)
{
f[j]=f[j]|h[j^w];
}
}
int a=-1;
for(int i=1023;i>=0;i--)
{
if(f[i][m])
{
a=i;
break;
}
}
cout<<a<<endl;
}
}