一个正整数x是质数,当且仅当x≥2且x不是任何一个[2,x−1]的数的倍数。
一个数字串是‘‘质数串‘‘,当且仅当它的每个非空连续子串表示的数字都是质数。
例子1:"373"是质数串,它的子串有"3"、"37"、"373"、"7"、"73"、"3",这些串表示的数字都是质数。
例子2:"55"不是质数串,因为"55"这个子串表示的数字不是质数。
相信聪明的你一定已经发现了一个事实,那就是质数串的限制很紧,所以质数串的数量其实非常稀少。
给定一个长度为n的数字串S,请统计它有多少个非空连续子串是质数串。注意两个子串如果位置不同也算不同,比如"373373"中,"373"要算入答案两次。
Input
第一行包含一个正整数T(1≤T≤30),表示测试数据的组数。
每组数据第一行包含一个正整数n(1≤n≤100000),表示数字串的长度。
第二行包含一个长度为n的仅由字符‘1‘到‘9‘组成的字符串S。
Output
对于每组数据输出一行一个整数,即是质数串的非空连续子串数量。
Sample Input
3 6 373373 5 37373 3 313
Sample Output
12 11 2 一拿到题感觉是dp 因为之前做过这种类似的字符dp 但是想不出来状态转移 题目暗示了质数串的条件非常严苛 所以可以枚举10000里面的答案 很快发现只有
2
3
5
7
23
37
53
73
373
满足质数串
很多题都可以枚举寻找普遍性来做 就像广工的那题简单数学题
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 500+5 bool su(int x) { if(x==1)return 0; rep(i,2,sqrt(x)) if(x%i==0)return 0; return 1; } int a[1000]; int main() { rep(i,2,10000) { int temp=i; int len=0; while(temp) { len++; a[len]=temp%10; temp/=10; } int ok=1; rep(j,1,len) rep(k,j,len) { int sum=0; repp(s,k,j) sum=sum*10+a[s]; if( !su(sum) )ok=0; } if(ok)printf("%d\n",i); } }
枚举
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 500+5 int main() { string s; int cas; RI(cas); while(cas--) { int cnt=0; int len; RI(len); cin>>s; rep(i,0,len-1) { if(s[i]==‘2‘)cnt++; if(s[i]==‘3‘)cnt++; if(s[i]==‘5‘)cnt++; if(s[i]==‘7‘)cnt++; if(s[i]==‘2‘&&s[i+1]==‘3‘)cnt++; if(s[i]==‘3‘&&s[i+1]==‘7‘)cnt++; if(s[i]==‘5‘&&s[i+1]==‘3‘)cnt++; if(s[i]==‘7‘&&s[i+1]==‘3‘)cnt++; if(s[i]==‘3‘&&s[i+1]==‘7‘&&s[i+2]==‘3‘)cnt++; } cout<<cnt<<endl; } return 0; }
原文地址:https://www.cnblogs.com/bxd123/p/10658075.html
时间: 2024-10-15 17:30:18