反着求,先求出所有序列个数,再减去不符合的个数。
黑边把图分成一个,一个的连通分量。
所以我们只要用dfs求出每个不包含黑边的连通分量的包含点个数sz,sz^k就是该集合不符合的个数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100050;
vector<int>ve[maxn];
struct node{
int nxt,to,f;
}e[maxn*2];
int cnt=0,head[maxn],vis[maxn];
void add(int u,int v,int f){
e[cnt].to=v;
e[cnt].f=f;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
int sz=0;
void dfs(int u,int fa){
vis[u]=1;
sz++;
for(int i=head[u];~i;i=e[i].nxt){
int v=e[i].to;
int f=e[i].f;
if(v==fa||f||vis[v]) continue;
dfs(v,u);
}
}
const ll mod=1e9+7;
ll fpow(ll a,ll p){
ll ans=1;
while(p){
if(p&1) ans=ans*a%mod;
a=a*a%mod;
p>>=1;
}
return ans;
}
int main()
{
int n,k;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&k);
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
ll ans=fpow(n,k);
for(int i=1;i<=n;i++){
if(vis[i]) continue;
sz=0;
dfs(i,i);
ans=(ans+mod-fpow(sz,k))%mod;
}
printf("%lld\n",ans);
return 0;
}
直接按题意模拟即可,用map存数来判环
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10050;
map<ll,int>mp;
int check(ll x){
if(x==1) return 1;
mp[x]=1;
ll ans=0;
while(x){
ll tmp=x%10;
x/=10;
ans+=tmp*tmp;
}
if(mp[ans]==1) return 0;
else return check(ans);
}
int main()
{
int n,x;
scanf("%d",&n);
for(int i=1;i<=n;i++){
mp.clear();
scanf("%d",&x);
if(check(x)) printf("true\n");
else printf("false\n");
}
return 0;
}
按题意模拟即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=150;
char a[maxn],b[maxn];
int main()
{
int t,x;
scanf("%d",&t);
while(t--){
scanf("%s%s",a+1,b+1);
int la=strlen(a+1);
int lb=strlen(b+1);
string s="";
vector<string>va,vb;
for(int i=1;i<=la;i++){
if(a[i]=='.'){
va.push_back(s);
s="";
}
else{
s+=a[i];
if(i==la) va.push_back(s);
}
}
s="";
for(int i=1;i<=lb;i++){
if(b[i]=='.'){
vb.push_back(s);
s="";
}
else{
s+=b[i];
if(i==lb) vb.push_back(s);
}
}
int flag=0;
for(int i=0;i<100;i++){
if(vb[i].length()>va[i].length()){
flag=1;
break;
}
else if(vb[i].length()<va[i].length()) break;
else{
if(vb[i]>va[i]){
flag=1;
break;
}
else if(vb[i]<va[i]) break;
}
if(i+1==vb.size()){
break;
}
else{
if(i+1==va.size()){
for(int j=i+1;j<vb.size();j++){
if(vb[j].length()>1){
flag=1;
break;
}
else if(vb[j][0]!='0'){
flag=1;
break;
}
}
break;
}
}
}
if(flag) printf("true\n");
else printf("false\n");
}
return 0;
}
水题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=150;
char a[maxn],b[maxn],ans[maxn];
int main()
{
gets(a);
gets(b);
int l1=strlen(a);
int l2=strlen(b);
int cnt=0,l=0,tmp=0;
for(int i=0;i<l1;i+=2){
ans[++cnt]=a[i];
tmp++;
if(tmp==4){
tmp=0;
if(l<l2){
ans[++cnt]=b[l];
l+=2;
}
}
}
while(l<l2) ans[++cnt]=b[l],l+=2;
printf("%c",ans[1]);
for(int i=2;i<=cnt;i++){
printf(" %c",ans[i]);
}
printf("\n");
return 0;
}