1004 Decimal
题意
给一个1/n 判断是否是无限小数
思路
n的因子如果只包含2和5
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 5005
#define mod 1000000007
using namespace std;
typedef long long ll;
int judge(int n)
{
while(n)
{
if(n%2==0||n==1)
{
n/=2;
}
else
break;
}
while(n)
{
if(n%5==0||n==1)
{
n/=5;
}
else
break;
}
if(n==0)
return 1;
else
return 0;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
if(!judge(n))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
1010 MUV LUV EXTRA
题意
给定a,b 计算所给的小数部分循环部分的可靠度:a x 循环部分出现长度p - b x 循环节 求最大可靠度是多少
思路
将小数逆序 然后求next数组 (next[i]表示字符串中以 i 结尾的非前缀字串与该字符串的前缀能匹配的最大长度) 循环节出现部分长度为i,循环节长度为i-next[i] (即i - 已经开始的循环数=循环节) 计算每一位暴力求最大值
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 10000005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll Next[N],a,b;
char s1[N],s2[N];
void GetNext(char *p)
{
int pLen = strlen(p);
Next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen)
{
//p[k]表示前缀,p[j]表示后缀
if (k == -1 || p[j] == p[k])
{
++k;
++j;
Next[j] = k;
}
else
{
k = Next[k];
}
}
}
int main()
{
while(~scanf("%lld%lld",&a,&b))
{
scanf("%s",s1);
int len=strlen(s1);
int tot=0;
for(int i=len-1;i>=0;i--){
if(s1[i]=='.') break;
s2[tot++]=s1[i];
}
ll ans=-1e18;
GetNext(s2);
for(int i=1; i<=tot; i++)
{
ans=max(ans,1ll*a*i-1ll*b*(i-Next[i]));
}
printf("%lld\n",ans);
}
return 0;
}
1006 Forest Program
题意
给n个点m条边 这些点边组成无自环和多边的连通无向图 删除某些边 使得剩余的图形成为任意个树(不成环) 问删边的方案数
思路
dfs遍历 找出所有环和环的大小 环的贡献是每个环2^size-1的累乘 最后乘上剩下的不成环m条边的贡献2^m
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 300005
#define mod 998244353
using namespace std;
typedef long long ll;
vector<int> edg[N];
int vis[N],h[N];
int a[N];//存每个环的大小
int tot;//记录环的个数
int n,m;
ll ksm(ll a,ll p)
{
ll ans=1;
while(p)
{
if(p&1)
ans=ans*a%mod;
a=a*a%mod;
p>>=1;
}
return ans;
}
void dfs(int now,int f)
{
h[now]=h[f]+1;
vis[now]=1;
for(auto v:edg[now])
{
if(v!=f&&vis[v]==1)
{
a[++tot]=h[now]-h[v]+1;
}
else if(!vis[v])
{
dfs(v,now);
}
}
vis[now]=2;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin>>n>>m;
int x,y;
for(int i=1; i<=m; i++)
{
cin>>x>>y;
edg[x].push_back(y);
edg[y].push_back(x);
}
for(int i=1; i<=n; i++)
{
if(!vis[i])
{
dfs(i,0);
}
}
ll ans=1;
for(int i=1; i<=tot; i++)
{
ans=ans*(ksm(2,a[i])-1)%mod;
m-=a[i];
}
ans=ans*ksm(2,m)%mod;
cout<<ans<<"\n";
return 0;
}