B:Binary Vector
详解
f(n)=f(n-1)* (2^n-1) / 2^n = f(n-1)*(1-1/2^n)
#include
using namespace std;
#define ll long long
const int mod=1e9+7;
ll a[20000010],x=5e8+4,y=5e8+4;
int main()
{
ios::sync_with_stdio(false);
int t,n;
a[1]=5e8+4;
for(int i=2;i<=2e7;i++)
{
x=x*y%mod;
a[i]=(a[i-1]-a[i-1]*x)%mod+mod;
}
for(int i=2;i<=2e7;i++)
a[i]^=a[i-1]; //ans=f1^f2^...^fn
cin>>t;
while(t--)
{
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}
C:Combination of Physics and Maths
寻找单列的子列最大值
原因
#include
using namespace std;
#define ll long long
double a[210][210];
int main()
{
int t,n,m;
double maxn;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&a[i][j]);
maxn=1;
for(int i=1;i<=m;i++)
{
double sum=0;
for(int j=1;j<=n;j++)
{
sum+=a[j][i];
maxn=max(maxn,sum/a[j][i]);
}
}
printf("%.8f\n",maxn);
}
return 0;
}
E:Easy Construction
构造:n K (x1,x2) (x3,x4) … :x1+x2=n,x3+x4=n; 偶数成立
或: n (x1,x2) (x3,x4)… 奇数成立
有趣的现象:
6:6,1+5,2+4,3+3 :k即3
5:6,1+4, 2+3 :k即0即第二种构造
#include
#include
#include
using namespace std;
int a[5010];
int main()
{
int n,k,sum=0;
cin>>n>>k;
if(k!=(n*(n+1)/2)%n)
{
cout<<-1<<endl;return 0;
}
if((k&&n%2)||(k==0&&n%2==0))
{
cout<<-1<<endl;return 0;
}
if(k)
{
a[1]=n;a[2]=k;sum=2;
}
else
{
a[1]=n;sum=1;
}
for(int i=1;i<=n/2;i++)
{
int j=n-i;
if(i!=j)
{
sum+=2;
a[sum-1]=i;a[sum]=j;
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
G:Grid Coloring
膜
#include
using namespace std;
int a[210][210],b[210][210];
int main()
{
int T,n,k,t;
scanf("%d",&T);
while(T--)
{
cin>>n>>k;
if(n==1||k==1||(2*n*(n+1))%k)
{
puts("-1");continue;
}
t=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
t=t%k+1;
a[i][j]=t;
}
for(int j=1;j<=n+1;j++)
{
t=t%k+1;
b[j][i]=t;
}
}
for(int i=1;i<=n;i++)
{
t=t%k+1;
a[n+1][i]=t;
}
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=n;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}
return 0;
}
H:Harmony Pairs
详解
#include
using namespace std;
#define ll long long
const ll mod=1e9+7;
ll dp[110][1810][2][2];//x,y,u,v
char c[910];
int len;
ll dfs(int x,int y,int u,int v)
{
if(x>len) return y>900;
if(~dp[x][y][u][v]) return dp[x][y][u][v];
long long tot=0,a,b,i,j;
if(u) a=c[x]-'0';
else a=9;
for(i=0;i<=a;i++)
{
if(v) b=i;
else b=9;
for(j=0;j<=b;j++)
(tot+=dfs(x+1,y+j-i,(u && i==a),(v && j==b)))%=mod;
}
return dp[x][y][u][v]=tot;
}
int main()
{
memset(dp,-1,sizeof(dp));
scanf("%s",c+1);
len=strlen(c+1);
printf("%lld\n",dfs(1,900,1,1));
return 0;
}
K:K-Bag
详解
//2 3 2 1 3 3 2 1
#include
using namespace std;
#define ll long long
int a[500010],b[500010],c[500010],d[500010];
int main()
{
ios::sync_with_stdio(false);
int t,n,k,x,y,cnt,flag;
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);//b:1 1 2 2 2 3 3 3
cnt=unique(b+1,b+n+1)-b-1; //cnt=3
for(int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;//将a[i]全部转换为顺序的1到k
//如2 3 2 1 3 3 8 5 变为2 3 2 1 3 3 5 4
x=1;
for(int i=1;i<=n;i++)
{
while(!c[a[x]]&&x<=n) //找到出现两次的数
{
c[a[x]]++;x++;
}
c[a[i]]--;
d[i]=x-i; //2 3 3 3 n+1-i;
}
y=0;
for(int i=1;i<=min(k,d[1]+1);i++)//
{
flag=1;
//找到从某点开始d[j]都等于k,
for(int j=i;j<=n;j+=k)
{
if(j+d[j]>=n+1) continue;//越界
else if(d[j]^k)
{
flag=0;break;
}
}
if(flag)
{
y=1;break;
}
}
if(y) puts("YES");
else puts("NO");
}
return 0;
}