T1:
*****当and mod 1e9+7时,若是2个小于1e9+7的数相加,则不需要用ll。
但这道题是乘25!!!!!!!!!
以后不能惯性思维直接用int。******
如果 s[i]!=0,那么s[i+1]=s[i]-1;
首先查一遍,如果出现错误,ans=0;
记0出现的次数为o
则ans=26*25^o;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long mo=1e9+7;
int a[100005];
int main()
{
int t;
cin>>t;
while(t--)
{
int ans=26;
int n;
cin>>n;
memset(a,0,sizeof(a));
for(int i=1;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++)
{
if(!a[i])
{
ans=(ans*25)%mo;
}
else if(a[i]!=a[i+1]+1)
{
ans=0;
break;
}
}
cout<<ans<<endl;
}
}
T2:
对于每组数据的6个点做一次floyd,然后对于每两个点有共6*6种情况,总复杂度约36n;
代码:
注意别老忘了scanf!!!!
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int mo=1e9+7;
int s[7][7],a[7];
inline jdz(int x)
{
if (x<0)
return -x;
else
return x;
}
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mo=1e9+7;
int t,n,m,a[7],s[7][7],x,y;
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (int i=1;i<=6;i++)
scanf("%d",&a[i]);
for (int i=1;i<=6;i++)
for (int j=1;j<=6;j++)
s[i][j]=abs(a[i]-a[j]);
s[1][2]=s[2][1]=s[3][4]=s[4][3]=s[5][6]=s[6][5]=1;
for (int i=1;i<=6;i++)
for (int j=1;j<=6;j++)
for (int k=1;k<=6;k++)
s[j][k]=min(s[j][k],s[j][i]+s[i][k]);
ll sum=0;
for (ll k=1;k<=m;k++)
{
scanf("%d%d",&x,&y);
int ans=abs(x-y);
for (int i=1;i<=6;i++)
for (int j=1;j<=6;j++)
ans=min(ans,abs(x-a[i])+s[i][j]+abs(y-a[j]));
sum=(sum+k*ans)%mo;
}
printf("%lld\n",sum);
}
return 0;
}
T3:
初步一想这样写比较保险:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
int dp[1<<17],a;
ll ans,mo=1e9+7;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,ma=0;
int x,y;
ll ans=0;
memset(dp,30,sizeof(dp));
dp[0]=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%d",&a);
for (int j=1;j<=(1<<17);j++)
{
dp[j]=min(dp[j],dp[j^a]+1);//方法二的情况
for (int k=0;k<=17;k++)
dp[j]=min(dp[j],dp[j^(1<<k)]+1);//方法一的情况
}
}
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
ans=(ans+dp[x^y]*i)%mo;
}
cout<<ans<<endl;
}
}
一想这样时间应该会超。
但居然过了。。。。。。。。1600ms。