2016_1_17_第二题

这道题调了大概一个多小时终于过了,有许多地方我希望记清楚,我还是记下来。

先给上代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 using namespace std;
 7 const int N = 3003;
 8 int n;
 9 int prime[N],pd,t,record[N];
10 bool vis[N];
11 int small[N],ts,tot;
12 int big[N],tb;
13 int biao[603][1003],size[1003];
14 long long dp[(1<<16)+10][603];
15 void dfs(int i,int linshi,int t,long long kk) {
16     if(t > ts) return;
17     if(kk*small[t]<=n) {
18         biao[i][++size[i]] = linshi+(1<<(t-1));
19         dfs(i,linshi+(1<<(t-1)),t+1,kk*small[t]);
20         dfs(i,linshi,t+1,kk);
21     }
22 }
23 inline void solve(int n) {
24     int k;
25     for(int s = 2 ; s <= n ; ++s) {
26         if(!vis[s]) prime[++t] = s;
27         for(int j = 1 ; j <= t && (k=prime[j]*s)<=n ; ++j) {
28             vis[k] = true;
29             if(s%prime[j]==0) break;
30         }
31     }
32     for(int i = 1 ; i <= n ; ++i) {
33         int linshi = i;
34         for(int j = 1 ; j <= t && linshi!=1 ; ++j) {
35             while(linshi%prime[j]==0 && linshi!=1) {
36                 linshi/=prime[j];
37                 record[prime[j]]++;
38             }
39         }
40     }
41     pd = sqrt(n);
42     for(int i = 1 ; i <= n ; ++i) {
43         if(record[i]%2==1) {
44             if(i<pd) small[++ts] = i;
45             else big[++tb] = i;
46         }
47     }
48     tot = ts+tb;
49     for(int i = 1 ; i <= ts ; ++i) dfs(i,(1<<(i-1)),i+1,small[i]),biao[i][++size[i]] = (1<<(i-1));
50     for(int i = 1 ; i <= tb ; ++i) dfs(i+ts,0,1,big[i]);
51     int end = (1<<ts)-1;
52     dp[end][1] = 1;
53     for(int i = 1 ; i <= tot ; ++i) {
54         for(int j = 0 ; j <= end ; ++j) {
55             if(dp[j][i]==0) continue;
56             dp[j][i+1] = dp[j][i];
57             for(int k = 1 ; k <= size[i] ; ++k)
58                 if((biao[i][k]&j)==biao[i][k]) dp[j-biao[i][k]][i+1] += dp[j][i];
59         }
60     }
61     printf("%lld",dp[0][tot]*2);
62 }
63 int main() {
64     freopen("test.in","r",stdin);
65     freopen("test.out","w",stdout);
66     scanf("%d",&n);
67     solve(n);
68 }
View Code

首先感觉那个DFS是可以直接做的,就是可以直接转移的,当时受了同学的蛊惑我于是打了个转移表。反正还是蛮优的,然后这道题重点就是DP了,最开始我只想考虑大质数的时候是可能有问题的。所以我把小质数加上来一起搞,可以处理出只选大质数的时候的方案。代码还是可以好好感受感受在最后一步J到大质数J+1的时候,我就可以知道集合s为各个状态时I的方案,然后就可以累加起来咯。

隔两天再看看,别忘了蛤蛤!

转载于:https://www.cnblogs.com/registerzxr/p/5149017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pi-odbc_2016-r2_.exe是一个文件名,具体来说是一个用于安装ODBC驱动程序的可执行文件。ODBC是一种开放式数据库连接标准,允许应用程序与各种类型的数据库进行通信。这个特定的文件名中的"pi"可能指的是某个特定的数据库或数据库软件产品。"odbc_2016-r2_"表示这个文件是2016年第2个发布版本的ODBC驱动程序。".exe"指明这是一个可执行文件,可以在Windows操作系统上运行。 如果你想安装这个文件,你可以双击运行它,然后按照安装向导的指示进行操作。安装过程可能需要管理员权限或特定的系统要求。安装完成后,你的计算机将具备通过ODBC接口与特定类型的数据库进行连接和通信的能力。 请注意,这只是对文件名的一般解释,具体情况可能会因环境和软件产品而异。如果你需要更详细的信息或有其他问,请提供更多背景信息。 ### 回答2: pi-odbc_2016-r2_.exe是一个文件的名称,这是一个Windows平台上的ODBC驱动程序安装包。ODBC(Open Database Connectivity)是一种标准的数据库访问接口,在Windows操作系统中起着重要的作用。 pi-odbc_2016-r2_.exe文件是用来安装ODBC驱动程序的可执行文件。通过安装该驱动程序,用户可以将电脑与各种数据库系统连接起来,并实现对数据库的访问和操作。这个驱动程序是针对特定版本的ODBC标准开发的,这里的“2016-r2”表示该驱动程序是针对2016年第二个发布的版本进行开发的。 pi-odbc_2016-r2_.exe文件可以通过运行该文件来开始安装过程。安装过程中会提示用户选择安装路径和相关配置选项。一般来说,用户需要根据自己的具体需求进行选择和配置。安装完成后,用户就可以在计算机上使用ODBC接口连接各种数据库,并进行数据的读取、写入和管理等操作。 总而言之,pi-odbc_2016-r2_.exe是一个用于安装ODBC驱动程序的可执行文件,它可以实现计算机与各种数据库之间的连接和数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值