头更更大
这个10月完就要去搞NOIP了。。。
10月30天也就3次测试。。。为保佑进省一我还是每次测试玩都写个总结。。
boomshakalaka。。。彻底全部写炸。。。
第一题双连通图都打好了最后输出卖萌
第二题不敢打状态压缩,第三题不会也就算了。。。
第一题全挂是什么鬼??????
拿面包砸死自己的心情都没了
最近态度明显没有以前积极了。。可能是之前考的还可以的原因。。然后自我膨胀被稍难一点的题啪啪打脸。。
还是一句话:多刷题!!
下面面详细解答:
T1 建设图(30/100):
考的是刚学过的很简单的双连通分量(在无向图中裸奔Tarjan)即可。。。找到所有入度为1的双连通分量。取为ans。
但是最后输出的时候做死的ans-1??????
(没有考虑到 菊花 发散图,当时只考虑了链状图)
(ans+1)/2就满分。。
自己去把自己拖出去枪毙5分钟
T2 乘积(0/100):
貌似70%的分是可以暴力做的?????
100%的正解用到了我最不擅长的状压Dp。。。今天要多练练再回来看。。一定要回来把这道题搞了!!!
T3 Math(0/100):
本来想的乱搞一个快速幂套快速乘。。。结果GG
GYR大佬一群人则是通过找规律直接搞出正解。。。膜拜orz
感想
多练状压Dp!!!多刷题!!!不要卖萌!!!
还有发现没事可以上洛谷 玩一玩 刷刷题。。。
代码
T1
std.cpp
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int kkk = 200005;
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
int n,m,val,res=0,ans=0;
int first[kkk];
struct node{
int u,v,val,next;
bool flag;
}side[kkk*2];
int cnt=0,top=0,tot=0,cci=1;
void addedge(int u,int v,int val)
{
side[++cci].u = u;
side[cci].v = v;
side[cci].val = val;
side[cci].next = first[u];
first[u] = cci;
}
bool visit[kkk];
int num[kkk],edge[kkk];
int dfn[kkk],low[kkk],belong[kkk],stk[kkk];
void tarjan(int u)
{
low[u]=dfn[u]=++cnt;
stk[++top]=u; visit[u]=true;
for(int i=first[u];i;i=side[i].next)
{
if(side[i].flag)continue;
side[i].flag = true;
side[i^1].flag = true;
int v = side[i].v;
if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}
else if(visit[v]){low[u]=min(low[u],dfn[v]);}
}
if(dfn[u]==low[u])
{
int v=-1;tot++;
while(u!=v)
{
v=stk[top--];
belong[v]=tot;
num[tot]++;
visit[v]=false;
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);
n=read(); m=read();
for(int i=1;i<=m;i++)
{
int u,v;
u=read(); v=read();
addedge(u,v,1);
addedge(v,u,1);
}
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
for(int i=2;i<=cci;i+=2)
if(belong[side[i].u]!=belong[side[i].v])
edge[belong[side[i].u]]++,
edge[belong[side[i].v]]++;
int ans=0;
for(int i=1;i<=tot;i++)
if(edge[i]==1)
ans++;
cout<<(ans+1)/2<<endl;
return 0;
}
T2
zay.cpp
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const int nod=1000000007;
int n,k;
int prime[18]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59};
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
bool check(ll x)
{
for(int i=1;i<=17;i++)
if(x%(prime[i]*prime[i])==0)
return false;
return true;
}
ll ans[600];
void get_ans(int pre,ll now,int cnt)
{
if(check(now))ans[cnt]++;
else return;
if(cnt==k) return;
for(register int i=pre+1;i<=n;i++)
get_ans(i,(ll)now*i,cnt+1);
}
int t,sum=0;
int main()
{
t=read();
while(t--)
{
sum=0;
n=read(); k=read();
memset(ans,0,sizeof(ans));
for(register int i=1;i<=n;i++)get_ans(i,i,1);
for(register int i=1;i<=k;i++)sum=(sum+ans[i])%nod;
cout << sum << endl;
}
}
std.cpp
T3
std.cpp
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
int X=0,w=1; char ch=0;
while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
return X*w;
}
ll x,y;
ll a;
int n;
ll ksc(ll x,ll y,ll z)//快速乘
{
ll ans=0;
while(y>0)
{
if(y&1)ans=(ans+x)%z;
y=y>>1;
x=(x+x)%z;
}
return ans;
}
ll ksm(ll x,ll y,ll z)//快速幂
{
ll ans=1;
while(y>0)
{
if(y&1)ans=ksc(ans,x,z);
y=y>>1;
x=ksc(x,x,z);
}
return ans;
}
int t;
int main()
{
t=read();
while(t--)
{
a=read(); n=read();
if(a%2){cout<<1<<endl;continue;}
else
{
int ans=0;
int maxx=(1<<n);
for(int i=2;i<=n;i+=2)
if(ksm(a,i,maxx)==ksm(i,a,maxx))
ans++;
int c=(n+a-1)/a;
int x=(1<<n)>>c;
int t=n>>c;
ans = ans+x-t;
cout<<ans<<endl;
}
}
return 0;
}