质数串 乱搞

  

一个正整数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

质数串 乱搞的相关文章

学渣乱搞系列之扩展KMP的那点事

扩展KMP牵涉了一些相对运动的姿势,比较费解!本学渣看了一天的扩展KMP,打算写点东西...本文看后,出现的后果本人一概不负责.毕竟我不是很会表达. 扩展KMP是搞什么灰机的?本学渣所知道的扩展KMP是来解集训篇那道字符串题的.有了犯罪动机,现在就要下手.不要以为扩展KMP就以为与KMP关系暧昧.屁大点事,两个根本不是一个东西.只是有点思想是一致的,就是利用已经匹配的信息避免一些不必要的匹配. 以此提高匹配速度.不过扩展KMP也能干KMP干的事.但是速度没KMP那么快. 扩展KMP要造两个数组,

学渣乱搞系列之后缀数组

学渣乱搞系列之后缀数组 by 狂徒归来 后缀数组,其nlogn的构造方法,比较麻烦,十几个循环,基数排序?计数排序?各种排序,各种凌乱,学渣表示鸭梨很大啊!学渣从<挑战程序设计竞赛>中偷学了一点nlog2n的构造方法. 字符串后缀(Suffix)是指从字符串的某个位置开始到其末尾的字符串子串.我们认为原串和空串也是后缀. 后缀数组(Suffix Array)指的是将某个字符的所有后缀按字典序排序后得到的数组.排序方式很多,时间复杂度也不同.有基数排序的倍增法o(nlogn),有DC3构造方法o

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

Codeforces 732e [贪心][stl乱搞]

/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给n个插座,m个电脑.每个插座都有一个电压,每个电脑都有需求电压. 每个插座可以接若干变压器,每个变压器可以使得电压变为x/2上取整. 有无限个变压器供应. 问最多能使得多少个插座与电脑匹配,使得电压一致. 如果有多种方案,输出需要变压器总数最小的那种. 输出匹配数量 输出每个插座需要接多少个变压器.输出每台电脑匹配哪个插座. 思路: 贪心 乱搞 先从小到大将插座排序,然后从地第一个插座开始,不断除以2上取整.不断找是否可以匹配.找到匹配就停

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

Bucharest, Romania 2013 H Red John Game 乱搞 未解

题意:给你一个无限的棋盘,里面有n×n的棋子,每个棋子可以跳过一个相邻(4个方向)棋子跳到下一个位置,并把他的相邻位(他跳过的那一位)删除. 解题思路:判断n%3 是否等于 0 , 原因未知. 解题代码: 1 #include<stdio.h> 2 int main(){ 3 int n ; 4 while(~scanf("%d",&n)) 5 { 6 if(n%3) 7 printf("1\n"); 8 else printf("0\

【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)

4692: Beautiful Spacing Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 21[Submit][Status][Discuss] Description 文章是一些单词组成的序列,单词由字母组成.你的任务是将一篇文章的单词填充到一个网格中,其中网格包含W列和足够多的行.为了布局之美,以下限制都需要满足. 1.文章中的文字需要按照原有的顺序放置.下图表示了将4个单词的文章“This is a pen”放入

【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][Discuss] Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信息点数,点数为房间里的人数,如果一个房间里的一群人已经做过实验了那么这些人将不会增

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &